2008-11-09 6 views
5

dane tabeli z 2 kolumny „Kategoria” i „podkategorii”zagnieżdżone zapytania linq, jak uzyskać różne wartości?

chcę uzyskać kolekcję „kategorii” [podkategorii] użyciu kodu poniżej i uzyskać duplikaty. Umieszczenie .Distinct() po zewnętrznym "od" niewiele pomaga. Czego mi brakuje?

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 wygląda to

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

co ja dostać w wynikach jest

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

ale chcę tylko jeden wpis

rozwiązać mój problem z tym kodem:

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

           select subcats); 

teraz być może nadszedł czas, aby pomyśleć o tym, co było właściwe pytanie .. (-:

Odpowiedz

5

rozwiązany z tym kodem

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

           select subcats); 

dzięki każdy

3

myślę, że trzeba 2 „Distinct()” połączeń, jeden dla głównych kategorii, a drugi do podkategorii.

ten powinien pracować dla Ciebie:

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

Uwaga do siebie: nauczyć się używać więcej groupbys następnym razem. – chakrit

1

Twoim głównym zapytanie jest na produkty, więc masz zamiar uzyskać dokumentację dla każdego produktu. Przełącz go, aby zapytać o kategorię, ale filtrowanie w Product.Category

2

Algorytm za Distinct() potrzebuje sposobu, aby stwierdzić, czy 2 obiekty w źródłowym IEnumerable są równe. Domyślną metodą jest porównywanie 2 obiektów według ich referencji, a zatem prawdopodobieństwo, że żadne 2 obiekty nie są "równe", ponieważ tworzysz je za pomocą słowa kluczowego "new".

Co musisz zrobić, to napisać niestandardową klasę, która implementuje IEnumerable i przekazuje ją do wywołania Distinct().