如何按属性分组并使用LINQ选择其他属性作为列表?
我不好解释它,所以这里有一个例子:
假设我有一个可以用JSON表示的C#对象列表:
[
{ "id":123, "name":"John", "carId":1, "carAge":3 },
{ "id":123, "name":"John", "carId":2, "carAge":4 },
{ "id":4, "name":"Mary", "carId":3, "carAge":3 },
{ "id":4, "name":"Mary", "carId":4, "carAge":3 },
{ "id":123, "name":"John", "carId":5, "carAge":3 }
]
在所有这些对象中,只有carId
是唯一的。
我想根据个人详细信息对它们进行分组,并将这些详细信息与关联的汽车详情结合起来。
最终结果看起来像这样但是作为c#对象:
[
{"id":123, "name":"John",
[
{"carId":1, "carAge":3},
{"carId":2, "carAge":4},
{"carId":5, "carAge":3}
]
},
{"id":4, "name":"Mary",
[
{"carId":3, "carAge":3},
{"carId":4, "carAge":3}
]
}
]
修改
我被困在
之后list.GroupBy(x => new { x.Id, x.Name })
因为我不需要任何集合功能,只需要选择。
我为没有发布更多代码而道歉,这是一个简化版本,真实的东西有更多过滤和复杂的域特定术语。
一切都在记忆中完成 - 没有DB担心。
答案 0 :(得分:3)
为group _ by _
表达式的每个部分创建一个包含所需字段的匿名对象。
使用以下任何一种方法,您将为每个密钥构建一个嵌套集合 - 当使用GroupBy
时,它不仅仅是聚合,而是关于特定数据组的操作。其中一例是聚合方法。
var result = from item in data
group new { item.carId, item.carAge } by new {item.id, item.name} into g
select g;
另一种方式是
var result = from item in data
group by new {item.id, item.name} into g
select new {
g.Key,
Data = g.Select(i => new {i.carId, i.carAge})
};
您尝试使用方法语法时可以使用以下重载:
var result = data.Group(k => new {k.id, k.name},
e => new {e.carId, e.carAge});
如果不是,只需为投影添加Select
:
var result = data.Group(k => new {k.id, k.name})
.Select(g => new {
g.Key,
Data = g.Select(i => new {i.carId, i.carAge})
});