powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Запрос к таблице с n столбцов
3 сообщений из 3, страница 1 из 1
LINQ-Запрос к таблице с n столбцов
    #38142809
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мною написана функция, которая выбирает уникальные значения в заданном пользователем столбце таблицы и подсчитывает количество соответствующих им уникальных значений во всех остальных столбцах.


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



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

Table1

F I O Year

Иванов Сергей Иванович 1980
Иванов Олег Петрович 1981
Иванов Кирилл Семенович 1980
Петров Сергей Семенович 1982
Петров Кирилл Семенович 1980
Сидоров Сергей Иванович 1983
Сидоров Иван Петрович 1980



при запуске функции:

Dim Itog=statArray(Table1, 0)

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

Main fl1 fl2 fl3

Иванов 3 3 2
Петров 2 1 2
Сидоров 2 2 2


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


Dim Itog=StatArray(Table1, 1)
выдаст:

Main fl1 fl2 fl3

Сергей 3 2 3
Олег 1 1 1
Кирилл 2 1 1
Иван 1 1 1


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

Функция работает, но только на таблицу с четырьмя столбцами. Для того, чтобы перестроить функцию под другое количество столбцов, необходимо менять код.
ВОПРОС: Можно ли как-то посредством LINQ-запроса(ов) сделать аналогичную, но универсальную функцию, которая работала бы с таблицами с любым количеством столбцов и при этом выдавала бы статистику по всем столбцам аналогично, как в приведенном выше случае?
...
Рейтинг: 0 / 0
LINQ-Запрос к таблице с n столбцов
    #38143313
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуглить по словам Linq & Pivot? Не проверял, но например вот ... ну и там будет много сцылков...
...
Рейтинг: 0 / 0
LINQ-Запрос к таблице с n столбцов
    #38144171
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, это совсем не то.
Pivot Table всего лишь экстраполирует строки в столбцы. Но при этом число исходных строк должно быть известно. Мне же надо построить универсальный запрос для таблицы с заранее неизвестным количеством столбцов.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ-Запрос к таблице с n столбцов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]