LINQ:基于子列表中的属性进行分组

时间:2011-03-10 10:05:42

标签: c# .net linq grouping

我正在尝试使用LINQ基于元数据创建文档的分组列表,元数据是文档上的列表。

以下是我的对象结构的外观:

List<Document>
         --> List<Metadata>
                      --> Metadata has a name and a value property.

我想基于具有名称ID的元数据标签对文档进行分组,并将它们分组,其中ID属性的值相同。

我试过这样:

var x = response.Document
         .GroupBy(d => d.Metadata.Where(dc => dc.Name == DocProperty.ID)
         .Select(dc => dc.Value));

这会生成单个文档的列表,但不会在ID上分组。

还考虑选择不同的ID列表,然后遍历文档列表并查找与ID匹配的文档。这似乎是一个很大的开销,因为对于不同列表中的每个ID,我必须每次进入元数据列表并查找文档,并且必须对找到的多个项目进行额外检查,获取我需要的属性等。

任何人都知道如何让这件事有效吗?

1 个答案:

答案 0 :(得分:20)

var x = from doc in source
        from meta in doc.Metadata
        where meta.Name == DocProperty.Id
        group doc by meta.Value;

或(评论)流利的表示法:

var y = source
    .SelectMany(doc => doc.Metadata, (doc, meta) => new { doc, meta })
    .Where(pair => pair.meta.Name == DocProperty.Id)
    .GroupBy(pair => pair.meta.Value, pair => pair.doc);