34 Stimmen

Entity Framework .Where Methodenverkettung

Gibt es einen Unterschied zwischen diesen beiden Möglichkeiten, den Kontext abzufragen?

Firm firm = base.context.Firms
            .Where(f => f.SomeId == someId)
            .Where(f => f.AnotherId == anotherId)
            .FirstOrDefault();

Firm firm = base.context.Firms
            .Where(f => f.SomeId == someId && f.AnotherId == anotherId)
            .FirstOrDefault();

Es scheint, dass eine Verkettung durchaus möglich ist, um die UND-Bedingung zu erfüllen. Ich glaube nicht, dass man OR-Anweisungen verketten kann. Gibt es einen Grund, die eine der anderen vorzuziehen, oder gibt es Szenarien, in denen die eine besser/effizienter ist?

48voto

Justin Niessner Punkte 235353

Sie sollten beide zum gleichen Ergebnis führen (wenn ich mich nicht irre), aber ich finde, dass die zweite Variante besser lesbar ist und die ursprüngliche Absicht besser zum Ausdruck bringt.


Update

Ich habe gerade die obige Aussage mit LINQPad überprüft. Beide Abfragen erzeugen in der Tat dasselbe SQL.

Zum Beispiel:

context.SomeTable.Where(c => c.ParentId == null)
                 .Where(c => c.Name.Contains("F"))
                 .Select(c => c.Name);

Produziert:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL)

Es handelt sich dabei um dasselbe SQL, das auch von:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F"))
                 .Select(c => c.Name);

Man könnte die Dinge auch etwas kompakter gestalten (was ich aus den gleichen Gründen wie oben vorziehe):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                                                  && f.AnotherId == anotherId);

2voto

dotariel Punkte 1579

Ich vermute, dass Sie, solange Sie mit in IQueryable (wie Ihre Kontextsammlungen wahrscheinlich sind), erreicht man mit den verketteten Erweiterungen im Vergleich zur vollständigen Prädikatsklausel dasselbe. Dies ist, weil IQueryable ermöglicht eine verzögerte Ausführung, so dass im Wesentlichen dieselbe SQL hinter den Kulissen generiert wird.

0voto

skaz Punkte 21224

Sie können den Code debuggen und die SQL-Abfrage sehen, die als Ergebnis der einzelnen Abfragen generiert wird. Ich könnte mir vorstellen, dass es sich um dieselbe Abfrage handelt.

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