4 Stimmen

Mehrere Verknüpfungen in einer Liste

Mit der folgenden Abfrage führe ich mehrere Verknüpfungen durch und wähle sie alle aus. Ich möchte dieses Ergebnis in einer Liste zurückgeben, also in diesem Fall würde ich eine Liste mit einer Anzahl von drei haben, unter der Annahme, dass es drei Adressen gibt, die mit dieser einzelnen Kunden-ID-Bestellung verbunden sind... Im Moment funktioniert die Abfrage, aber wenn ich exp.ToList() einfüge, erhalte ich im Wesentlichen eine 2D-Liste (eine Liste mit einem einzelnen Element, in der dieses Element eine Liste vom Typ 3 Elemente ist. Ich bin sicher, es gibt eine gute Möglichkeit, dies zu tun... Gedanken ?

   var exp = (

        from t in this.reposOrders.All()

        join p1 in this.reposAddress.All()
        on t.AddressPrimary equals p1.AddressID into pp1
        from p1 in pp1.DefaultIfEmpty()

        join p2 in this.reposAddress.All()
        on t.AddressSecondary equals p2.AddressID into pp2
        from p2 in pp2.DefaultIfEmpty()

        join p3 in this.reposAddress.All()
        on t.AddressThird equals p3.AddressID into pp3
        from p3 in pp3.DefaultIfEmpty()

        where t.CustomerID == customerID

        select new { p1, p2, p3 }
    );

2voto

Preet Sangha Punkte 62622

Können Sie SelectMany ? Es gibt viele Linq-Beispiele hier http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

0voto

Randolpho Punkte 54011

Was Sie tun möchten, leidet unter schlechter Normalisierung; AddressPrimary, AddressSecondary und AddressThird sollten keine Felder von Orders sein (ich nehme an, dass die Reihenfolge in Ihrer Zeile from t in this.reposOrders.All() ), sondern sollte in einer schwachen Entitäts- oder Join-Tabelle enthalten sein.

Allerdings können Sie mit der folgenden Abfrage wahrscheinlich erreichen, was Sie wollen:

var primary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressPrimary;
var secondary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressSecondary;
var tertiary = from t in this.reposOrders.All() where t.CustomerID == customerID select t.AddressThird;
var ids = primary.Union(secondary).Union(tertiary);
var addresses = from a in this.reposAddress.All() where ids.Contains(a.AddressID) select a;

0 Stimmen

Danke für Ihre Kritik an der Normalisierung, aber ich bin anderer Meinung.

0 Stimmen

Das war schlecht formuliert von mir, tut mir leid. Obwohl ich glaube, dass es besser wäre, eine Join-Tabelle zu verwenden. Haben Sie die von mir beschriebene Vorgehensweise ausprobiert? Er fasst im Wesentlichen Ihre primären, sekundären und tertiären Adressen in einer einzigen Liste von IDs zusammen, die dann abgefragt wird, um die gewünschten Adressen zu erhalten. Da LINQ die Ausführung aufschiebt, werden Sie nicht tatsächlich durch die Iterationen gehen, bis Sie ToList() aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X