2010-02-25 12 views
47

Z linq Muszę sprawdzić, czy wartość w wierszu jest obecna w tablicy.
Równowartość zapytania SQL:Co to jest odpowiednik linq dla operatora SQL IN

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

Jak mogę to zrobić?

+1

[Zapytania SQL w LINQ] (http://www.codeducky.org/sql-queries-in-linq/#where-in) zapewnia tłumaczenia typowych operacji SQL, w tym 'GDZIE IN 'do LINQ. –

Odpowiedz

45

.Contains

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

oczywiście z Twojej prostego problemu, można mieć coś takiego:

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

Otrzymuję błąd: 'int [] nie zawiera definicji" zawiera ". – nam

3

IEnumerable<T>.Contains(T) oświadczenie powinien robić to, czego szukasz.

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

lub

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

wykonać równoważnik IN SQL z IEnumerable.Contains().

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

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

bardzo prosty przykład przy użyciu .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

Możesz to dużo wyczyścić, zmieniając pętlę 'for' na' IEnumerable list = Enumerable.Zakres (1, 10); ' –

+0

Punkt wzięty. +1 Ale szczerze mówiąc, właśnie pisałem kod, który, jak wiedziałem, działałby bez potrzeby testowania go :) – Kamal

1

można napisać help-metody:

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

i korzystania krótki kod:

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

Przecięcie i Z wyjątkiem są nieco bardziej zwięzłe i będzie prawdopodobne y też być nieco szybszy.

IN

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

IN

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

lub

składni metoda IN

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

a nie w

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

Po to ogólna metoda rozszerzenie, które mogą być wykorzystywane do wyszukiwania wartości w liście wartości:

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; 
    } 

ten może być stosowany jako:

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

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

Jest to przydatne w warunkowy sprawozdania.

Powiązane problemy