2008-11-09 49 views
5

2列「類別」和「子類別」嵌套linq查詢,如何獲取不同的值?

的表數據我想用代碼下面我得到重複得到的「類別」的集合,[子類別] 。 Puting .Distinct()在外部「from」之後沒有多大幫助。我錯過了什麼?

var rootcategories = (from p in sr.products 
           orderby p.category 
            select new 
            { 
             category = p.category, 
             subcategories = (
             from p2 in sr.products 
             where p2.category == p.category 
             select p2.subcategory).Distinct() 
            }).Distinct(); 

sr.products看起來像這樣

category subcategory 
---------------------- 
cat1  subcat1 
cat1  subcat2 
cat2  subcat3 
cat2  subcat3 

我所得到的結果中是

cat1, [subcat1,subcat2] 
cat1, [subcat1,subcat2] 

,但我只想要一個條目

解決了我這個代碼的問題:

var rootcategories2 = (from p in sr.products 
           group p.subcategory by p.category into subcats 

           select subcats); 

現在也許是時候想起了什麼是正確的問題。( - :

回答

5

解決與此代碼

var rootcategories2 = (from p in sr.products 
           group p.subcategory by p.category into subcats 

           select subcats); 

感謝大家

3

我想你需要2「另類()」調用,一個主要類別,另一個用於子類別。

這應該爲你工作:

var mainCategories = (from p in products select p.category).Distinct(); 

var rootCategories = 
    from c in mainCategories 
    select new { 
     category = c, 
     subcategories = (from p in products 
         where p.category == c 
         select p.subcategory).Distinct() 
    }; 
+1

自我提醒:學會用更groupbys下一次。 – chakrit 2008-11-09 18:07:37

1

你的主要查詢的產品,所以你會得到記錄每一件產品。切換它,以便查詢類別,但過濾Product.Category

2

Distinct()背後的算法需要一種方法來判斷源IEnumerable中的2個對象是否相等。 默認方法是通過引用來比較2個對象,因此可能由於您使用「new」關鍵字創建它們,所以沒有2個對象「相等」。

你需要做的是編寫一個實現IEnumerable並將其傳遞給Distinct()調用的自定義類。