.NET 3.5中与DataTable的聚合函数

时间:2011-12-09 06:08:16

标签: c# datatable

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

我想将上表作为结果表。我应该采取什么措施来获得理想的结果。 ?

OR

我可以在这里使用LINQ吗?请注意,P1,P2和P3为typeof(bool)

结果表后面的逻辑group by用户名,并对P1行,P2行,P3行使用OR操作。并且只有一个FolderName

1 个答案:

答案 0 :(得分:3)

根据你的描述很难知道你真正需要什么,但我会猜测。我的第一个想法是删除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)
                              });

这样做可能会有一些更有效的方法,但我希望这是非常合理的 - 如果你想要更高的效率,你应该尝试将逻辑移动到任何数据库查询产生表格。