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

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

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

List --> List --> 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,我必须每次进入元数据列表并找到文档并且必须对找到的多个项目进行额外检查,获取我需要的属性等。

任何人都知道如何使这个东西工作?

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