2011-03-10 57 views
9

我试图使用LINQ根据文档上的列表元数据创建文档的分组列表。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,我必须每次进入元数据列表并找到文档,并且必须对发现的多个项目进行额外检查,获取我需要的属性等。

任何人都有一个关于如何让这个东西工作的好主意?

回答

17
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); 
+0

这工作!谢谢 – ChristiaanV 2011-03-10 10:43:10

+0

有没有一种简单的方法可以将其转换为流畅的符号? 我试了一下,但并不确定把GroupBy放在哪里,所以它可以访问meta.value属性。 这是我尝试: VAR Y = response.Document .GroupBy(d => d.DocumentCharacteristic 。凡(DC => dc.Name == DocProperty.InvoiceNumber) 。选择(dc => dc.Value)); – ChristiaanV 2011-03-10 10:47:37

+1

请注意,每个分组中的meta.Value应该是'.Key' ... – 2011-03-10 11:07:08

相关问题