如果要选择多个要分组的列,请尝试以下操作:
DataTable dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
group row by new { T = row["T"], U = row["U"] } into valueGroup
select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
这将为您提供作为匿名类型对象返回的多个列,这些对象T
和U
属性可在Value
返回集的字段中访问。
我已经对此进行了测试,它似乎适用于示例数据集。
它基于此处描述的解决方案:http: //social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755。
编辑
当使用group by
子句时,所有项目都被分成组,每个组只返回一个项目,所以为了引用一个列,你必须把它放在group by
子句中或者在它上面使用聚合方法(就像你对ID
字段所做的那样和Max()
方法)。
但是,如果要创建组,请获取ID
每个组的最大值,然后检索这些项目的其他列(每个组中具有最大值ID
),您可以将 ajoin
用于同一个表。此代码显示了如何在您的示例T
和U
列的情况下执行此操作。它似乎在测试数据集上正常工作:
var dtListEnumerable = dtList.AsEnumerable();
//group items and get max ID for each group
var groupedTemp = from row in dtListEnumerable
group row by row["T"] into valueGroup
select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
//join to get the rest of columns for each item with max ID returned for each group
var grouped = from groupedItem in groupedTemp
join row in dtListEnumerable on groupedItem.ID equals row["ID"]
into tablesJoined
from row in tablesJoined.DefaultIfEmpty()
select new
{
ID = groupedItem.ID,
T = row["T"],
U = row["U"]
};
如果您需要任何帮助,请告诉我。如果它没有返回您要检索的数据,请提供有关它的更多详细信息。