我有一个DataTable,我希望用一个列进行分组。
我使用此代码:
DataTable dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
group row by row["T"] into valueGroup
select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
我的问题是:选择两列(id,value)。我想选择乘法列。
如何选择dtlist的其他列?
答案 0 :(得分:2)
如果要选择要分组的多个列,请尝试以下操作:
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
group)你可以使用同一个表的join
。此代码显示了如何针对示例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"]
};
如果您需要任何帮助,请告诉我。如果它没有返回您想要检索的数据,请提供有关它的更多详细信息。
答案 1 :(得分:1)
选择dtList中的多个列(column1,column2,colummn3):
DataTable dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
group row by row["T"] into valueGroup
select new {
Value = valueGroup.Key,
ID = valueGroup.Max(id => id["ID"]),
col1 = row["column1"].ToString(),
col2 = row["column2"].ToString(),
col3 = row["column3"].ToString()
};