2010-07-19 14 views
2

Depuis IEnumerable.Contains() méthode n'accepte pas un prédicat comme argument, la plupart des gens utilisent le code suivant pour vérifier l'existence de quelque chose correspondant à une condition:Dans Linq, comment trouver si un ensemble contient un élément sans utiliser Count (prédicat)?

// ProductId is unique. 
if (Products.Count(c => c.ProductId = 1234) == 1) 
{ 
    // Products list contains product 1234. 
} 

Cette force de code à marcher à travers chaque produit et de vérifier si cela correspond. Il n'y a vraiment pas besoin de le faire. Lorsque vous observez le code SQL généré Linq-to-SQL, le problème est le même. Une instruction select count(*) ... where ProductId = @p0 est envoyée au lieu de if exists.

Comment Linq peut-il déterminer si un ensemble contient un élément correspondant à une condition, sans devoir parcourir tous les éléments d'un ensemble et compter le nombre de correspondances?

Répondre

14

Vous pouvez essayer

if (Products.Any(c => c.ProductId = 1234)) 
{ 
//do stuff 
} 

Je ne sais pas si cela utilise un si existe, mais vous pouvez essayer de voir ce qui est envoyé.

+0

Cela fonctionne. La requête Sql est 'select (cas où existe (...) puis 1 sinon 0 fin)'. Je vous remercie. –

1

Si vous essayez de vérifier une condition que vous pouvez utiliser le code suivant

if(Products.Any(p => p.ProductID == 1234)) 
{ 
    //do sth 
} 

mais si vous voulez vérifier si des lignes existent sans aucune condition comme p.ProductID == 1234 vous devez faire ce qui suit

if(Products.Any(p => p != null)) 
{ 
//do sth 
}