2008-11-09 6 views
5

Tabellendaten von 2 Spalten „Kategorie“ und „Untergruppe“verschachtelte Linq-Abfragen, wie erhält man unterschiedliche Werte?

Ich mag eine Sammlung von „Kategorie“ bekommen, [Kategorie] Code unten i Duplikate erhalten. Das Putting .Distinct() nach dem äußeren "from" hilft nicht viel. Was vermisse ich?

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 sieht aus wie dieses

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

bekomme ich in den Ergebnissen, was

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

, aber ich möchte nur einen Eintrag

mein Problem mit diesem Code gelöst:

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

           select subcats); 

jetzt vielleicht ist es Zeit, zu denken, was war die richtige Frage .. (-:

Antwort

5

mit diesem Code

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

           select subcats); 

dankt alle

3

Ich glaube, Sie brauchen 2 „Distinct()“ Anrufe, eine für die Hauptkategorien und eine weitere für die Unterkategorien.

Dies sollte für Sie arbeiten:

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

Hinweis zur Selbsthilfe: lernen, mehr groupbys beim nächsten Mal. – chakrit

1

Ihre Haupt-Abfrage auf Produkte ist, so dass Sie gehen für jedes Produkt Datensätze zu erhalten. Schalten Sie es um, so dass Sie nach Kategorie suchen, aber nach Produkt filtern. Kategorie

2

Der Algorithmus hinter Distinct() benötigt eine Möglichkeit, um festzustellen, ob 2 Objekte in der Quelle IEnumerable gleich sind. Die Standardmethode dafür ist, 2 Objekte anhand ihrer Referenz zu vergleichen, und daher ist es wahrscheinlich, dass keine 2 Objekte "gleich" sind, da Sie sie mit dem Schlüsselwort "new" erstellen.

Sie müssen eine benutzerdefinierte Klasse schreiben, die IEnumerable implementiert und diese an den Distinct() - Aufruf weitergibt.