Как реализовать tsql "IN" эквивалент с использованием динамического Linq - PullRequest
5 голосов
/ 26 июля 2011

Я создаю общую форму (C #), которая может принимать любой запрос Linq. В этой форме я хочу иметь возможность добавлять фильтры (предложения WHERE). Для таких операторов, как '=', '>', 'Like' и т. Д. Я могу сделать что-то вроде IQueryable.Where(someFieldname + "> @0", someCriteria). Но когда я хочу сделать эквивалент T-sql "IN", я полностью теряюсь. Я искал часы, но не могу найти способ понять это.

Думая об этом, можно сделать так, чтобы значения IN-предложения были помещены в строковый массив или какой-либо другой простой список строк. Затем присоединитесь к этому списку с помощью базового запроса. Но как я могу объединить эти два, когда базовый запрос может быть любым запросом?

Пример: Скажем, мой базовый запрос выглядит примерно так:

IQueryable<Object> q = from a in db.Adresses
                       select new { a.Street, a.HouseNr };

В форме я хочу иметь возможность фильтровать на HouseNr следующим образом: Где HouseNr IN (1, 3, 5) Числа (1, 3, 5) доступны в виде массива строк (или любого другого списка строк).

Как мне этого добиться, зная, что базовый запрос может быть чем угодно?

Ответы [ 4 ]

4 голосов
/ 26 июля 2011
int[] list = new[]{1, 3, 5};
IQueryable<Object> q = from a in db.Adresses
                       where list.Contains(a.HouseNr)
                       select new { a.Street, a.HouseNr };
2 голосов
/ 26 июля 2011

Contains отображается на IN при генерации SQL.

int[] numbers = new int[] { 1, 3, 5 };

var q = from a in db.Addresses
        where numbers.Contains(a.HouseNr)
        select new { a.Street, a.HouseNr }
0 голосов
/ 30 июля 2011

Просто мысль ... разве метод .Intersect() не возвращает значения списка, где значения существуют в обоих?

0 голосов
/ 26 июля 2011

Как насчет этого ...

string[] Numbers = new string[]{"1", "3", "5"};
IQueryable<Object> q = db.Adresses.Where(a => Numbers.Contains(h.HouseNr));
...