2009-09-10 3 views
2

Par exemple, si j'avais un contexte de données Linq to SQL, ou si j'avais ADO.NET Entity Framework entités mises en correspondance avec une table de base de données, et je veux tester un seul client ...Dans LINQ, quelle est la principale différence/utilité entre .Any <> et .Where <> pour tester les enregistrements existants

y at-il beaucoup de différence entre:

MyDatabaseContext.Customers.Any(c => c.CustomerId == 3) 

et

MyDatabaseContext.Customers.Where(c => c.CustomerId == 3) 

.Tout <> - retour type bool

.Lorsque <> - type de retour IQueryable

EDIT: Correction formulation de la question après avoir accepté de réponse Fredrik Mörk - merci.

Répondre

15

Consultez la documentation de nouveau:

  • Any<> retourne un bool indiquant si au moins un élément répond aux critères
  • Where<> retourne un IEnumerable contenant les éléments qui répondent aux critères

Il peut être une différence de performance dans ce Any s'arrête dès qu'il peut déterminer le résultat (quand il trouve un élément correspondant), tandis que Where devra toujours boucler tous les éléments avant de renvoyer le résultat. Donc, si vous avez seulement besoin de vérifier s'il y a des éléments correspondants, Any sera la méthode pour le travail.

+1

pinailler: Où retourne un IEnumerable lorsqu'il est utilisé dans un Linq à contexte des objets.L'OP a donné l'exemple en tant que contexte Linq to SQL, donc il retournerait un IQueryable. Pas que ça compte beaucoup. Le mieux serait d'écrire 'IEnumerable/IQueryable', ou une séquence. –

+1

@Martinho: les bons points. Cependant, je continuerais à argumenter que 'Where <>' renvoie un 'IEnumerable' pour deux raisons: l'une est que' IQueryable' hérite de 'IEnumerable'. Une autre raison est que lorsque je traite avec des interfaces, je préfère généralement m'en tenir à l'interface définie par le contrat, plutôt que ce qui est * effectivement * renvoyé par le fournisseur sous-jacent. De cette façon, le code dépend moins des composants internes des méthodes appelées, ce qui le rend plus portable. –

+0

"while Où devra toujours boucler tous les éléments avant de renvoyer le résultat" Pas toujours vrai. Par exemple, dans LINQ to objects, puisque le 'IEnumerable ' renvoyé est évalué paresseusement, si vous ajoutez un '.Any()' à '.Where (quelque chose)', ** il ne ** passera pas sur tous les éléments . –

2

Any() renvoie un bool. C'est à dire. y a-t-il des éléments correspondant à la condition? Utilisez Any() si vous voulez juste savoir si vous avez des éléments avec lesquels travailler. Par exemple. par exemple Any() sur Count() == 0 par exemple car ce dernier peut énumérer l'ensemble de la séquence pour savoir si elle est vide ou non.

Where() renvoie une séquence des éléments correspondant à la condition.

3

Any renvoie bool tandis que Where renvoie IQueryable. Étant paresseux, on s'attendrait à ce que Any se termine dès qu'un élément satisfaisant est trouvé (renvoyant vrai) tandis que Where les recherchera tous. Si vous souhaitez sélectionner un seul client, Single est ce que vous recherchez.

2

Any<>Any<>Any<> vérifie si des éléments satisfont le critère, c'est-à-dire renvoie bool, ce qui signifie qu'il lui suffit de trouver le premier élément, ce qui peut être très rapide. Considérant que Where<> énumère tous les éléments qui satisfont la condition, ce qui signifie qu'il doit itérer toute la collection.

1

Tout test lambda/sous-jacente et renvoie true/false

Où retourne l'ensemble des objets pour lesquels lambda/prédicat est vrai que IQueryable

Questions connexes