web-dev-qa-db-fra.com

Entity Framework .Where méthode chaînage

Y a-t-il une différence entre ces deux façons d'interroger le contexte?

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();

Il semble que le chaînage soit parfaitement fin pour accomplir la condition ET. Je ne crois pas que vous puissiez enchaîner les instructions OR. Y a-t-il une raison de préférer les unes aux autres, ou des scénarios où l'un est meilleur/plus efficace?

28
e36M3

Ils devraient tous deux produire le même résultat final (si je ne me trompe pas), mais je trouve que le second est plus lisible et montre mieux l'intention d'origine.


Mise à jour

Je viens de vérifier la déclaration ci-dessus en utilisant LINQPad. Les deux requêtes produiront en fait le même SQL.

Par exemple:

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

Produit:

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

Quel est le même SQL produit par:

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



Vous pouvez également compacter un peu plus les choses (ce que je trouve préférable pour les mêmes raisons que ci-dessus):

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

Je suppose que tant que vous travaillez dans IQueryable (comme le sont probablement vos collections de contexte), l'utilisation des extensions chaînées par rapport à la clause de prédicat complète permet d'obtenir la même chose. C'est parce que IQueryable permet une exécution différée, donc essentiellement le même SQL est généré en arrière-plan.

2
dotariel

Vous pouvez déboguer à travers le code et voir le SQL qui est généré à la suite de chacun. J'imagine que cela se transforme en la même requête.

0
skaz