我有这样的数据表:
我想将此表分组为FIELD A和FIELD B, 我的组的第三个字段应该是FIELD C的列表,但必须按ID字段分组。
最后,结果应该是这样的:
First Field | Second Field | Third Field
------------+--------------+----------------
5 | XXXX |(8) (2,6,3) (9)
5 | KKKK |(8,3)
第三个字段必须是列表列表。
如何使用LINQ执行此操作?
到目前为止我试过这个:
var trytogroup = (from p in datatable.AsEnumerable()
group p by new
{
ID = p["Id"].ToLong(),
FieldA = p["FieldA"].ToLong(),
FieldB = p["FieldB"].ToString()
} into g
select new
{
FirstField = g.Key.FieldA,
SecondField = g.Key.FieldB,
ThirdField = datatable.AsEnumerable().Where(p => p["FieldA"].ToLong() == g.Key.FieldA && p["FieldB"].ToString() == g.Key.FieldB).Select(p => p["FieldC"].ToLong()).GroupBy(x => x["Id"].ToLong()).Distinct().ToList()
});
答案 0 :(得分:5)
您的查询有什么问题:
正确查询:
from r in datatable.AsEnumerable()
group r by new {
FieldA = r.Field<long>("FieldA"),
FieldB = r.Field<string>("FieldB")
} into g
select new
{
First = g.Key.FieldA,
Second = g.Key.FieldB,
Third = g.GroupBy(r => r.Field<long>("ID"))
.Select(idGroup => idGroup.Select(i => i.Field<long>("FieldC")).ToList())
}
答案 1 :(得分:0)
如果您喜欢lambdas,您的查询可能如下所示:
dataSource
.GroupBy(item => new { item.FieldA, item.FieldB })
.Select(group => new
{
First = group.Key.FieldA,
Second = group.Key.FieldB,
Third = group.GroupBy(q => q.Id).Select(q => q.Select(e => e.FieldC).ToArray()).ToArray()
}).ToArray();
答案 2 :(得分:0)
只是几个小笔记。 .GroupBy
使用Lookup
来获取Grouping
,因此当不需要执行自定义执行时,可以通过将.GroupBy(
替换为.ToLookup(
来避免一些开销。
每个Grouping
中的元素都是stored in array,因此我认为转换它们.ToList
并没有多大用处(但如果转换它们可以节省一些空间{{ 1}})。
.ToArray
使用.Rows.Cast<TRow>()
,但在通常不需要DataTable.AsEnumerable
排序或过滤时,似乎还会做一些额外的事情。
DataView
像往常一样premature optimization is the root of all evil,但我认为这些信息可能有用。