2017-12-08 2 views
1

Ich habe die folgende Abfrage in SQL, die ich in LINQ-Anweisung konvertieren möchte.Gruppe von LINQ vs Gruppe von SQL

select AreaId, BrandId, MilestoneId, DocumentCategoryId 
from Document 
group by AreaId, Brandid, MilestoneId, DocumentCategoryId 

Ich habe versucht, zum Beispiel

var docs = 
    from d in documents 
    group d by new 
    { 
     d.Area, 
     d.Brand, 
     d.MilestoneId, 
     d.DocumentCategoryId 
    } into gcs 
    select new Group() 
    { 
     Area = gcs.Key.Area, 
     Brand = gcs.Key.Brand, 
     MilestoneId = gcs.Key.MilestoneId, 
     DocumentCategoryId = gcs.Key.DocumentCategoryId, 
    }; 

Und

var docs = documents 
    .GroupBy(d => new Group 
    { 
     Area = d.Area, 
     Brand = d.Brand, 
     MilestoneId = d.MilestoneId, 
     DocumentCategoryId = d.DocumentCategoryId, 
    }) 

aber das Ergebnis in SQL gibt 88 Zeilen (Ziel), in Abfragesyntax 78 Zeilen und in LINQ 270 (Gesamtzahl).

Ich möchte eine LINQ-Anweisung für 88 Zeilen zurückgeben.

+1

Warum verwenden Sie eine Gruppe? wenn Sie nur an dem ** Schlüssel ** interessiert sind und nicht an den Aggregateinträgen, die zu dem Schlüssel gehören? Gibt es einen Grund, warum du 'Distinct' nicht im Gegensatz zu' GroupBy' verwendest? (sowohl in SQL als auch in Code) – Flater

+0

sind die Daten in einer Datenbank? Wenn ja, was ist falsch mit der Verwendung von sql und Offloading der Fetch auf den Db-Server? Es ist eine sehr schlechte Idee, wenn Sie alle Daten in den Speicher laden möchten, nur weil Sie linq verwenden möchten. – Rob

+1

@Rob angenommen, dass 'Dokumente' ist eine' Tabelle '/' DbSet 'oder ähnlich: es lädt nicht" alle Daten "- es lädt alle einzigartigen Kombinationen - obwohl ich Flater zustimmen, dass, wenn es nicht ' t ein Aggregat, würde Distinct "offensichtlicher" sein –

Antwort

1

Ich erwarte, dass die Endfassung im Wesentlichen auf LINQ-to-Objects wechselt - also ein GroupObjekt pro Zeile bevölkert, dann in .NET Begriffen Gruppierung, die eine Zeile pro Gruppe bedeuten, wie ich Ihre Group zweifeln implementiert die richtigen Muster für die Gleichheit. Um LINQ ist die letzte Version korrekt zu behandeln, müssen Sie wahrscheinlich einen anonymen Typ in die Mischung hinzufügen (LINQ versteht dies wie ein Tupel verhalten soll):

var docs = documents 
    .GroupBy(d => new 
    { 
     Area = d.Area, 
     Brand = d.Brand, 
     MilestoneId = d.MilestoneId, 
     DocumentCategoryId = d.DocumentCategoryId, 
    }).Select(grp => new Group { 
     Area = grp.Key.Area, 
     Brand = grp.Key.Brand, 
     MilestoneId = grp.Key.MilestoneId, 
     DocumentCategoryId = grp.Key.DocumentCategoryId, 
    }); 

Wie für die 88 vs 78: haben Sie sah Welche SQL wird ausgegeben? Das sollte dir sagen, was es anders macht.

+0

Danke für die schnelle Antwort. Und das wurde in der Tat übersetzt, wenn man sich die tatsächlich gesendete SQL-Abfrage anschaut. –