2010-11-03 80 views
-2

我正在嘗試對相關產品對象列表執行LINQ查詢。我必須按CategoryId對它們進行分組,因此我使用了group by子句。不幸的是,我只是意識到我不能簡單地在最後使用'select g.Value'。該組是一個IGrouping,我想在這裏返回RelatedProduct。我怎樣才能做到這一點?如何在LINQ中進行分組

同樣在我的情況下,一個產品可以同時在兩個類別,所以我怎樣才能防止LINQ返回重複?我只對第一類感興趣(實際上,只要它被分配給該產品,這並不重要)。

var query = from rp in context.RelatedProducts 
        join p in context.Products on rp.ProductId2 equals p.ProductId 
        join pc in context.ProductCategories on p.ProductId equals pc.ProductId 
        where rp.ProductId1 == productId1 && 
        !p.Deleted && 
        (showHidden || p.Published) 
        orderby rp.DisplayOrder 
        group rp by pc.CategoryId into g 
        select g; 
+0

如果你只在第一類感興趣,那麼爲什麼不直接加在那裏pc.CategoryId == interestingcategory而不是分組,然後丟棄以外的所有組首先? – 2010-11-03 11:23:42

+0

當我說有更多的類別我的意思是產品和類別之間有多對多的關係。這就是我正在處理的數據庫的結構。我實際上只使用每種產品的一個類別。 – 2010-11-03 11:28:02

回答

-2

我設法做到這一點是這樣的:

List<RelatedProduct> relatedProducts = new List<RelatedProduct>(); 
     foreach (var group in query) 
     { 
      var key = group.Key; 
      relatedProducts.AddRange(group.ToList()); 
     } 
+2

在這種情況下,你不能在查詢中打了一個.SelectMany(g => g).ToList()並得到相同的結果嗎? – Frank 2010-11-03 12:55:37

+0

如果我知道如何,我可以有:))這是我期望的答案:D – 2010-11-03 13:27:34

0

在你的情況gIEnumerable,所以你可以只使用select g.First()或申請任何額外的濾波給它。