Что такое linq эквивалент оператора SQL IN - PullRequest
51 голосов
/ 25 февраля 2010

С помощью linq я должен проверить, присутствует ли значение массива в массиве.
Эквивалент запроса sql:

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

Как я могу это сделать?

Ответы [ 8 ]

48 голосов
/ 25 февраля 2010

.Contains

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

Конечно, с вашей простой проблемой вы можете получить что-то вроде:

var resultset = from x in collection where x >= 2 && x <= 5 select x
25 голосов
/ 25 февраля 2010

Выполнить эквивалент SQL IN с помощью IEnumerable.Contains () .

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

var result = from x in source
          where idlist.Contains(x.Id)
          select x;
10 голосов
/ 25 февраля 2010
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));

или

from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)
8 голосов
/ 11 июля 2014

Intersect и Except немного более лаконичны и, вероятно, тоже будут немного быстрее.

IN

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

НЕ В

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

или

Синтаксис метода для IN

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

и НЕ В

collection.Where(x => !(new[] {2,3,4,5}.Contains(x)));
3 голосов
/ 25 февраля 2010

Оператор IEnumerable<T>.Contains(T) должен делать то, что вы ищете.

2 голосов
/ 25 февраля 2010

Очень простой пример использования .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 голос
/ 25 февраля 2010

Вы можете написать help-метод:

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

и используйте короткий код:

    var resultset = from x in collection
                    where Contains(x, 2, 3, 4, 5)
                    select x;
0 голосов
/ 06 марта 2015

Ниже приведен общий метод расширения, который можно использовать для поиска значения в списке значений:

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

Это можно использовать как:

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

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

Это удобно в условных выражениях.

...