Wie mache ich das in Entity Framework (mehrere Wheres oder Join)?

c# entity-framework linq linq-to-entities

Frage

Ich habe 2 Tische, die eine Beziehung zueinander haben

Tabelle A hat eine zu viele Beziehung zu Tabelle B, sodass eine Navigationseigenschaft in jeder erstellt wird.

Jetzt muss ich einen Wert aus Tabelle A (userName) und einen Wert aus Tabelle B (ClubId) überprüfen.

In meinen Augen wäre es also so etwas

Join the tables together
Where A.userName == "bob" &&
where B.clubId == "Car"

// return the count.

Aber jetzt weiß ich mit Entity-Sachen, dass es Joins weniger üblich machen sollte.

Ich habe es versucht

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count();

Das funktioniert also nicht, da es nicht den richtigen Typ (den 2. wo) gibt. Ich dachte genau so, wie ich es erwarten würde.

Wie soll es aussehen?

PS

Ich habe lieber ein Beispiel in den Linq-Methodenabfragen wie ich es oben gemacht habe.

Akzeptierte Antwort

Das Filtern von TableA vor dem Beitritt ist wahrscheinlich effizienter:

var clubs = from a in Entity.TableA
            where a.userName == "bob"
            from b in a.TableB
            where b.clubId == "Car"
            select b;

var count = clubs.Count();

Sie müssen nicht zwei Variablen verwenden, ich halte es hier aus Gründen der Klarheit.

Oder in der Methodensyntax können Sie etwas vereinfachen:

var count = Entity.TableA.Where(a => a.userName == "bob")
                         .SelectMany(a => a.TableB)
                         .Count(b => b.clubId == "Car");

Ich bin mir jedoch nicht sicher, ob EF diese Ausdrücke versteht. Wenn nicht, würde der Compiler die obige Abfrage folgendermaßen übersetzen:

var count = Entity.TableA.Where(a => a.userName == "bob")
                         .SelectMany(a => a.TableB, (a,b) => new { a, b })
                         .Where(x => x.b.clubId == "Car")
                         .Count();

Beliebte Antwort

Angenommen, Ihr EF-Modell hat die Beziehung zwischen Benutzern und Clubs in etwa wie folgt:

var usersNamedBobInCarClub = 
             from A in User
             from B in A.Clubs
             where A.userName == "bob" &&
                   B.clubId == "Car"
             select A;

Wenn Sie Elemente von Benutzern und Clubs zurückgeben möchten, sehen Sie sich die Verknüpfungen in der Abfrage an.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum