Entity Framework .Où la méthode de chaînage
Quelle est la différence entre ces deux manières 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 est parfaitement bien à accomplir ET de l'état. Je ne crois pas que vous pouvez de la chaîne OU de déclarations. Est-il une raison de préférer l'une sur l'autre, ou les scénarios lorsque l'on est mieux/plus efficace?
Vous devez vous connecter pour publier un commentaire.
Elles doivent produire le même résultat final (si je ne me trompe pas) mais je trouve que le deuxième est plus lisible et mieux apparaître l'intention d'origine.
Mise à jour
Je viens de vérifié la déclaration ci-dessus à l'aide de LINQPad. Les deux requêtes, en fait, produit de la même SQL.
Par exemple:
Produit:
Qui est le même SQL qui est produit par:
Vous pouvez aussi compact choses un peu plus (que je trouve préférable pour les mêmes raisons que ci-dessus):
&&
dans un seulWhere()
, mais si je mets chaque clause dans son propre.Where(l =>...)
, je suis d'or. /preStandupFaceRubAndShrug ;^DMa conjecture est que tant que vous travaillez dans le
IQueryable
(comme votre contexte, les collections sont sans doute), à l'aide de l'enchaînement des extensions de vs le plein de prédicat de la clause réalise la même chose. C'est parce queIQueryable
permet l'exécution différée donc essentiellement les mêmes SQL est généré en coulisses.Vous pouvez déboguer le code et voir le SQL, qui est généré à la suite de chaque. J'imagine qu'il tourne dans la même requête.