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

C# LINQ:基于子列表中的属性进行分组,c#,.net,linq,grouping,C#,.net,Linq,Grouping,我正在尝试使用LINQ创建基于元数据的文档分组列表,元数据是文档上的列表 下面是我的对象结构的外观: List<Document> --> List<Metadata> --> Metadata has a name and a value property. 这将生成单个文档的列表,但不会按ID分组 还考虑了选择一个不同的ID列表,然后在文档列表中循环查找与ID匹配的文档。这似乎是一个很大的开销

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

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

List<Document>
         --> List<Metadata>
                      --> Metadata has a name and a value property.
这将生成单个文档的列表,但不会按ID分组

还考虑了选择一个不同的ID列表,然后在文档列表中循环查找与ID匹配的文档。这似乎是一个很大的开销,因为对于不同列表中的每个ID,我每次都必须进入元数据列表中查找文档,并对找到的多个项进行额外检查,得到我需要的财产等等

有人知道如何让这东西工作吗

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);

有没有一种简单的方法将其转换为流畅的符号?我尝试了一下,但并不确定GroupBy放在哪里,这样它就可以访问meta.value属性。这就是我尝试的:var y=response.Document.GroupBy(d=>d.DocumentCharacteristic.Where(dc=>dc.Name==DocProperty.InvoiceNumber)。选择(dc=>dc.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);