На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> LINQ-Запрос к таблице с n столбцов
    Мною написана функция, которая выбирает уникальные значения в заданном пользователем столбце таблицы и подсчитывает количество соответствующих им уникальных значений во всех остальных столбцах.


    ExpandedWrap disabled
      Function statArray(ByVal dTable As DataTable, ByVal numMainCol As Integer) As System.Array
       
       'Создаю массив имен столбцов в таблице, по которым будет произведен подсчёт статистики (все кроме основного столбца, по которому будет осуществляться группировка)
       Dim addCols(dTable.Columns.Count - 1) As String
       Dim numAddCol As Integer = 0 'Счётчик статистических столбцов
       For i = 0 To dTable.Columns.Count - 1
       If i <> numMainCol Then
       numAddCol = numAddCol + 1
       addCols(numAddCol) = dTable.Columns(i).ColumnName
       End If
       Next
       
       'LINQ-запросы на подсчет статики по каждому столбцу (можно, конечно, объединить всё в один запрос, но так будет более понятно)
       
       Dim q1 = From dt In dTable _
       Group dt.Field(Of Object)(addCols(1)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _
       Into cnt = Count() _
       Select ff = f_by, cnt = cnt
       
       Dim q2 = From dt In dTable _
       Group dt.Field(Of Object)(addCols(2)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _
       Into cnt = Count() _
       Select ff = f_by, cnt = cnt
       
       Dim q3 = From dt In dTable _
       Group dt.Field(Of Object)(addCols(3)) By f_by = dt.Field(Of Object)(dTable.Columns(numMainCol).ColumnName) _
       Into cnt = Count() _
       Select ff = f_by, cnt = cnt
       
       'Теперь объединяющий запрос, собирающий статистику по всем столбцам в одну таблицу
       Dim query = From dt1 In q1 _
       Join dt2 In q2 On dt2.ff Equals dt1.ff _
       Join dt3 In q3 On dt3.ff Equals dt1.ff _
       Select main = dt1.ff, f1 = dt1.cnt, f2 = dt2.cnt, f3 = dt3.cnt
       
       'Возврат массива
       statTable = query.ToArray
       
       End Function



    То есть, для таблицы:

    ExpandedWrap disabled
      Table1
       
      F         I       O     Year
       
      Иванов Сергей Иванович 1980
      Иванов Олег Петрович 1981
      Иванов Кирилл Семенович 1980
      Петров Сергей Семенович 1982
      Петров Кирилл Семенович 1980
      Сидоров Сергей Иванович 1983
      Сидоров Иван Петрович 1980



    при запуске функции:
    ExpandedWrap disabled
      Dim Itog=statArray(Table1, 0)


    Я получаю результат:

    ExpandedWrap disabled
      Main fl1 fl2 fl3
       
      Иванов 3 3 2
      Петров 2 1 2
      Сидоров 2 2 2


    из которого видно, что на лиц с фамилией Иванов приходится 3 уникальных имени, 3 уникальных отчества и 2 уникальных года рождения и т.д.


    ExpandedWrap disabled
      Dim Itog=StatArray(Table1, 1)

    выдаст:

    ExpandedWrap disabled
      Main fl1 fl2 fl3
       
      Сергей 3 2 3
      Олег 1 1 1
      Кирилл 2 1 1
      Иван 1 1 1


    И так далее по всем четырём столбцам.

    Функция работает, но только на таблицу с четырьмя столбцами. Для того, чтобы перестроить функцию под другое количество столбцов, необходимо менять код.
    ВОПРОС: Можно ли как-то посредством LINQ-запроса(ов) сделать аналогичную, но универсальную функцию, которая работала бы с таблицами с любым количеством столбцов и при этом выдавала бы статистику по всем столбцам аналогично, как в приведенном выше случае?
      LINQ-запросы на подсчет статики по каждому столбцу преобразовать в цикл, а финальный запрос переписать на Dynamic LINQ - http://code.msdn.microsoft.com/vstudio/LIN...ueries-b471d1bd
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0242 ]   [ 16 queries used ]   [ Generated: 1.05.24, 12:20 GMT ]