Агрегатная функция с DataTable в .NET 3.5 - PullRequest
0 голосов
/ 09 декабря 2011

DataTable может иметь следующую структуру и данные.

Folder    User   P1 P2 P3
------------------------
FolderOne UserA  1  0  1
FolderOne UserA  0  0  0
FolderOne UserA  1  0  0
FolderOne UserB  1  1  1
FolderOne UserB  0  1  1
FolderOne UserC  0  0  0
------------------------

Result

FolderOne UserA  1  0  1
FolderOne UserB  1  1  1

Я хотел бы получить приведенную выше таблицу в качестве таблицы результатов. Какие операции я должен сделать, чтобы получить желаемый результат.

ИЛИ

Могу ли я использовать LINQ здесь. Обратите внимание, что P1, P2 и P3 typeof(bool)

Логика за таблицей результатов - group by Имя пользователя и использование операции OR для строк P1, строк P2, строк P3. И будет только один FolderName.

1 Ответ

3 голосов
/ 09 декабря 2011

Трудно понять, что вам действительно нужно, основываясь на вашем описании, но я собираюсь догадаться.Моей первой мыслью было бы удалить сторону DataTable, чтобы мы могли работать с последовательностью строго типизированных объектов, не мешая DataTable ... что мы можем сделать так:

var tableData = dataTable.AsEnumerable()
                         .Select(row => new {
                                     Folder = row.Field<string>("Folder"),
                                     User = row.Field<string>("User"),
                                     P1 = row.Field<bool>("P1"),
                                     P2 = row.Field<bool>("P2"),
                                     P3 = row.Field<bool>("P3")
                                 });

Затем, предположив, что вы хотите «ИЛИ» результаты после группировки по папке и пользователю, вы можете использовать:

var result = tableData.GroupBy(row => new { row.Folder, row.User })
                      .Select(g => new {
                                  Folder = g.Key.Folder,
                                  User = g.Key.Folder,
                                  P1 = g.Any(row => row.P1),
                                  P2 = g.Any(row => row.P2),
                                  P3 = g.Any(row => row.P3)
                              });

Возможно, есть несколько более эффективных способов сделать это, но яВы ожидаете, что это будет достаточно разумно - и если вы хотите большей эффективности, вам, вероятно, следует попытаться переместить логику в любой запрос к базе данных, производящий таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...