2016-08-02 7 views
0

Ich habe 3 Tabellen: Tabelle A, B und C. Tabelle A hat Primärschlüssel "Id", beide Tabelle B und C verknüpfen diese Tabelle durch Speichern der ID in einem FK-Mitglied.Wie man einen äußeren Join in eine Liste beim Verbinden einer dritten Tabelle macht

Ich möchte folgendes:

Für jede Zeile in Tabelle A, die passende Zeile in Tabelle B erhalten (die Id von A gleich der FK von Tabelle B) und auch jede Zeile in der Tabelle C erhalten, die FK = Id.

So soll mein Ergebnis eine Liste sein:

{ 
    TableARow, 
    TableBRow, 
    List<TableCRow> 
} 

var query = from r in context.TableA 
     join c in context.TableB 
     on r.Id equals c.FK 
     join m in context.TableC 
     on r.Id equals m.FK 
     into mappings 
     select new MyViewModel 
     { 
      A = r, 
      B = c, 
      C = mappings.ToList() 
     }; 

var result = query.ToList(); 

Die Abfrage oben ist, was ich habe, aber es gibt nur ein Element jedes Mal für mappings.ToList().

Vielen Dank

+0

Anstelle der Verwendung von Joins, warum nicht die Navigationseigenschaften der Entitäten verwenden? https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

Antwort

0

Wenn Sie Ihre verschiedenen Tabellen die Art und Weise join Sie Ihr Modell täte, würde so etwas wie { TableARow, TableBRow, TableCRow } aussehen.

Wenn Sie stattdessen es haben wollen, dass TableCRow innerhalb eines List ist, sollten Sie die A und B Reihen GroupBy:

var query = (from r in context.TableA 
     join c in context.TableB 
     on r.Id equals c.FK 
     join m in context.TableC 
     on r.Id equals m.FK 

     group m by new { r, c } into grouping 

     select new MyViewModel 
     { 
      A = grouping.Key.r, 
      B = grouping.Key.c, 
      C = grouping.ToList() 
     }).ToList();