我正在尝试使用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,我必须每次进入元数据列表并查找文档,并且必须对找到的多个项目进行额外检查,获取我需要的属性等。
任何人都知道如何让这件事有效吗?
答案 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);