2016-07-09 7 views
0
var largeset = 
from invs in context.Invoices 
join lines in context.InvoiceLines on invs.InvoiceId equals lines.InvoiceId 
join tracks in context.Tracks on lines.TrackId equals tracks.TrackId into grp 
select new 
      { 
       Invoice = invs, 
       Detail = grp 
      }; 

In der obigen Join-Anweisung ist Detail eine Liste, aber es enthält nur die Spalten "Invoice" und "Track". Ich möchte auch Spalten von InvoiceLine bekommen können.Wie alle Felder in einer Mehrfachverknüpfung in Linq-Anweisung enthalten?

Vielen Dank im Voraus.

+0

Nun, dann schließen Sie in das 'select' ein, was auch immer Sie mögen von der' line' Variablen (die eine einzelne 'InvoiceLine' darstellt, also besser' line'). –

+0

@Ivan, bist du sicher, dass das funktioniert? Jede Rechnung hat mehrere Zeilen. Was ich will ist '{Rechnung, IEnumerable }' – superfly71

+0

Es war nicht klar, dass Sie das wollen. Nein, es wird nicht funktionieren. Wie wirst du die Tracks dann bekommen? Da dies EF zu sein scheint, haben Sie keine Navigationseigenschaften? –

Antwort

1

Wenn Sie die Zeile Infoliste für die Rechnung erhalten mögen, müssen Sie die into zum ersten join bewegen und die anderen join innerhalb der äußeren select auszuführen.

Etwas wie folgt aus:

var largeset = 
    from inv in context.Invoices 
    join line in context.InvoiceLines on inv.InvoiceId equals line.InvoiceId into lines 
    select new 
    { 
     Invoice = inv, 
     Lines = 
      from line in lines 
      join track in context.Tracks on line.TrackId equals track.TrackId 
      select new { Line = line, Track = track } 
    }; 
+0

Hi Ivan, würde nicht mit groupby-in sein, um leistungsfähig zu sein? Ihr Ansatz funktioniert, aber es verwendet eine Unterauswahl, die im Wesentlichen eine Auswahl von "Zeile" und "Spur" für jeden "Rechnungs" -Datensatz ausführt. Sehen Sie sich das zugrunde liegende SQL an, das von Ihrer linq-Anweisung generiert wurde. Siehe meine Antwort als Alternative. Vielen Dank! – superfly71

+0

Hallo, ich kann nicht sagen, was besser ist, weil ich dein Modell nicht habe und auch die Abfrage in deiner Antwort hat eine völlig andere Ausgabe als die in der Frage. Im Allgemeinen ist eine Abfrage ohne Gruppierung nach besser als eine Abfrage mit Gruppe nach, wenn nur Informationen ausgewählt werden :) Aber Ihr aggregiert. Wie auch immer, es ist gut zu sagen, was Sie in der Frage erreichen wollen. weil wir jetzt 2 völlig unterschiedliche Fragen beantworten :) –

0

Als Alternative zu Ivans Lösung, die eine bessere Leistung ergeben sollte.

var largeset = 
    from invs in context.Invoices 
    join lines in context.InvoiceLines on invs.InvoiceId equals lines.InvoiceId 
    join tracks in context.Tracks on lines.TrackId equals tracks.TrackId 
    group new { invs, lines, tracks } 
    by new 
    { 
     invs.InvoiceId, 
     invs.InvoiceDate, 
     invs.CustomerId, 
     invs.Customer.LastName, 
     invs.Customer.FirstName 
    } into grp 
    select new 
    { 
     InvoiceId = grp.Key.InvoiceId, 
     InvoiceDate = grp.Key.InvoiceDate, 
     CustomerId = grp.Key.CustomerId, 
     CustomerLastName = grp.Key.LastName, 
     CustomerFirstName = grp.Key.FirstName, 
     CustomerFullName = grp.Key.LastName + ", " + grp.Key.FirstName, 
     TotalQty = grp.Sum(l => l.lines.Quantity), 
     TotalPrice = grp.Sum(l => l.lines.UnitPrice), 
     Tracks = grp.Select(t => t.tracks) 
    }; 
Verwandte Themen