C# NET 3.5中带有DataTable的聚合函数

C# NET 3.5中带有DataTable的聚合函数,c#,datatable,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 ------------------------ Re

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)


结果表后面的逻辑是
用户名分组,并对P1行、P2行、P3行使用
操作。而且只有一个
FolderName

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

可能有更有效的方法来实现这一点,但我认为这是非常合理的-如果您想要更高的效率,您可能应该尝试将逻辑移到数据库查询生成的表中。

结果表背后的逻辑是什么?如果有其他文件夹,和其他用户?为什么结果表不显示FolderOne UserC 0?如果一个用户有两个文件夹名,会发生什么情况?请不要让我们一直猜测需求。@Jon Skeet请查看我的编辑:)@Rauf:如果只有一个文件夹名,为什么还要费事包括它呢?而且你还没有解释为什么UserC没有一行。
dataTable
dataTable
的对象吗?@AVD以及我如何将
结果
转换为
DataTabel
?@Rauf:你真的需要它作为
dataTable
?你想对结果做什么?就我个人而言,我试图尽可能远离
DataTable
。。。
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)
                              });