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)
});