Entity Framework Join 3 Tabellen

133

Ich versuche, drei Tabellen zu verbinden, aber ich kann die Methode nicht verstehen ...

Ich habe Join 2 Tische abgeschlossen

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

Tabellen

Ich möchte die Tabelle tbl_Title in die TID PK aufnehmen und das Feld Title erhalten .

Vielen Dank

Erçin Dedeoğlu
quelle
Lesen Sie diesen Artikel. Es wird nicht die Methodennotation verwendet, aber Sie sollten in der Lage sein, das Wesentliche zu erfahren ... stackoverflow.com/questions/11204367/…
xspydr
Bitte zeigen Sie ein Bild mit erweiterten Navigationseigenschaften. Navigationseigenschaften sind vorgefertigte Verknüpfungen.
Gert Arnold

Antworten:

201

Ich denke, es wird einfacher sein, syntaxbasierte Abfragen zu verwenden:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

Und Sie sollten wahrscheinlich eine orderbyKlausel hinzufügen , um sicherzustellen, dass Top(10)die richtigen Top-Ten-Elemente zurückgegeben werden.

MarcinJuraszek
quelle
3
Vielen Dank für die Methode; funktioniert klar, aber ich würde gerne die Antwort sehen, als ich gefragt habe, nochmals vielen Dank.
Erçin Dedeoğlu
@MarcinJuraszek: Wenn ich ein ViewModel zum Arbeiten benötige, muss ich mich dann den Tabellen anschließen?
Vini
Dies funktioniert auch ohne Async nicht. Ich habe das genaue Szenario, aber die Abfrage löst eine Ausnahme aus [the_list_of_all_return_variables] 'kann nicht serialisiert werden. @marcinJuraszek - Könnten Sie einen Blick auf stackoverflow.com/questions/42453123/…
sandiejat
1
PERFEKT! Du hast mir so viel Zeit gespart :)
MohammadHossein R
81

Dies ist nicht getestet, aber ich glaube, die Syntax sollte für eine Lambda-Abfrage funktionieren. Wenn Sie mit dieser Syntax mehr Tabellen verknüpfen, müssen Sie einen weiteren Drilldown in die neuen Objekte durchführen, um die Werte zu erreichen, die Sie bearbeiten möchten.

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);
Pynt
quelle
16
Das ist schrecklich. Wenn ich jemals eine solche Abfrage im Produktionscode finden würde, würde ich sie sofort umgestalten. +1 für die Beantwortung der gestellten Frage!
Dan Bechard
8
@Dan Ist es aus Neugier einfach die überhaupt nicht durchdachte Namenskonvention mit c, cm und ccm oder einfach die Syntax, die erforderlich ist, um die Verknüpfungen mit linq und lambda durchzuführen, abscheulich? Wenn erstere und Sie den Beitrag bearbeiten möchten, um ein besseres Layout zu erhalten, haben Sie es auf jeden Fall. Ich bin noch neu im Entity Framework und beschäftige mich immer noch mit Best Practices. Wenn Sie also Vorschläge haben, um diese Antwort für zukünftige Benutzer beredter zu gestalten, würde ich mich über die Unterstützung freuen.
Pynt
4
Ich hatte nicht genau über den genauen Grund nachgedacht, als ich kommentierte, aber sicherlich beeinträchtigten die Namenskonventionen die Lesbarkeit (obv. Von OP kopiert). Außerdem beeinträchtigten die Kommas als Zeilenanfang die Lesbarkeit erheblich (für mich subjektiv), und Leerzeichen / Einrückungen konnten leicht verbessert werden. Ich habe eine Bearbeitung mit all diesen (IMHO) Verbesserungen eingereicht, seit Sie sie angefordert haben.
Dan Bechard
2
Die Code-Formatierung ist oft voreingenommen, aber es gibt allgemeine Dinge, denen die meisten Menschen zustimmen, dass sie besser aussehen. In Bezug auf Namenskonventionen habe ich früher sehr kurze Namen genannt, aber jetzt kann ich schnell genug tippen (ohne Rücksicht auf Dinge wie Intellisense), so dass die wenigen gespeicherten Zeichen den Nachteil der Lesbarkeit nicht wert sind, wenn man Dinge wörtlich benennt, z. B. "EntryID". "EID", "kombinierter Eintrag" vs. "cm" usw. Irgendwann wird jemand anderes meinen Code lesen, und ich möchte lieber, dass er keinen Hass auf mich als lineare Funktion der Anzahl meiner Zeilen entwickelt Code, den sie lesen / pflegen mussten.
Dan Bechard
5
Ich verstehe die Argumente gegen Komma-Startzeilen einfach nicht. Ich bin fest davon überzeugt, da es das Auskommentieren einzelner Klauseln / Argumente sehr einfach macht. Und es sieht schöner aus :-)
Auspex