2010-02-25 7 views
47

Avec linq, je dois vérifier si une valeur d'une ligne est présente dans un tableau.
L'équivalent de la requête SQL:Quel est l'équivalent linq de l'opérateur SQL IN

WHERE ID IN (2,3,4,5) 

Comment puis-je faire?

+1

[Requêtes SQL dans LINQ] (http://www.codeducky.org/sql-queries-in-linq/#where-in) fournit des traductions des opérations SQL courantes, notamment «WHERE IN» à LINQ. –

Répondre

45

.Contains

var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x 

Bien sûr, avec votre problème simple, vous pourriez avoir quelque chose comme:

var resultset = from x in collection where x >= 2 && x <= 5 select x 
+0

Je reçois l'erreur: 'int [] ne contient pas de définition de contains'. – nam

3

Une déclaration IEnumerable<T>.Contains(T) devrait faire ce que vous cherchez.

9
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x)); 

ou

from x in db.SomeTable 
where new[] {2,3,4,5}.Contains(x) 
24

Perform l'équivalent d'un SQL IN avec IEnumerable.Contains().

var idlist = new int[] { 2, 3, 4, 5 }; 

var result = from x in source 
      where idlist.Contains(x.Id) 
      select x; 
2

Un exemple très basique à l'aide .Contains()

List<int> list = new List<int>(); 
for (int k = 1; k < 10; k++) 
{ 
    list.Add(k); 
} 

int[] conditionList = new int[]{2,3,4}; 

var a = (from test in list 
     where conditionList.Contains(test) 
     select test); 
+1

Vous pouvez nettoyer cela beaucoup en changeant votre boucle 'for' à' IEnumerable list = Enumerable.Plage (1, 10); ' –

+0

Point pris. +1 Mais pour être juste, j'écrivais juste du code que je savais capable de travailler sans avoir besoin de le tester :) – Kamal

1

Vous pouvez écrire l'aide-méthode:

public bool Contains(int x, params int[] set) { 
     return set.Contains(x); 
    } 

et utilisez le code court:

var resultset = from x in collection 
        where Contains(x, 2, 3, 4, 5) 
        select x; 
8

Intersection et Sauf sont un peu plus concis et seront probables y être un peu plus rapide aussi.

IN

collection.Intersect(new[] {2,3,4,5}); 

NOT IN

collection.Except(new[] {2,3,4,5}); 

ou

syntaxe Procédé pour IN

collection.Where(x => new[] {2,3,4,5}.Contains(x)); 

et NOT IN

collection.Where(x => !(new[] {2,3,4,5}.Contains(x))); 
0

Voici une méthode d'extension générique qui peut être utilisé pour rechercher une valeur dans une liste de valeurs:

public static bool In<T>(this T searchValue, params T[] valuesToSearch) 
    { 
     if (valuesToSearch == null) 
      return false; 
     for (int i = 0; i < valuesToSearch.Length; i++) 
      if (searchValue.Equals(valuesToSearch[i])) 
       return true; 

     return false; 
    } 

Cela peut être utilisé comme:

int i = 5; 
i.In(45, 44, 5, 234); // Returns true 

string s = "test"; 
s.In("aa", "b", "c"); // Returns false 

Ceci est pratique dans conditionnelle déclarations.