2011-03-10 54 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

相關問題