Linq GroupBy并选择其他属性作为列表

时间:2017-07-20 06:05:18

标签: c# linq

如何按属性分组并使用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担心。

1 个答案:

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