Объединить предикаты LINQ-to-SQL в один предикат
(Предыдущий вопрос,Рекурсивно (?) Объединять предикаты LINQ в один предикат, похоже на это, но я фактически задал неправильный вопрос ... решение там удовлетворило поставленный вопрос, но на самом деле это не то, что мне нужно. Хотя они разные. Honest.)
Учитывая следующий текст поиска:
"keyword1 keyword2 ... keywordN"
Я хочу закончить со следующим SQL:
SELECT [columns] FROM Customer
WHERE (
Customer.Forenames LIKE '%keyword1%'
OR
Customer.Forenames LIKE '%keyword2%'
OR
...
OR
Customer.Forenames LIKE '%keywordN%'
) AND (
Customer.Surname LIKE '%keyword1%'
OR
Customer.Surname LIKE '%keyword2%'
OR
....
OR
Customer.Surname LIKE '%keywordN%'
)
По сути, мы разбиваем текст поиска на пробелы, обрезаем каждый токен, строим из нескольких частей предложение OR на основе каждого, а затем объединяем предложения AND.
Я делаю это в Linq-to-SQL, и я не знаю, как динамически составлять предикат на основе произвольно длинного списка субпредикатов. Для известного количества предложений легко составить предикаты вручную:
dataContext.Customers.Where(
(
Customer.Forenames.Contains("keyword1")
||
Customer.Forenames.Contains("keyword2")
) && (
Customer.Surname.Contains("keyword1")
||
Customer.Surname.Contains("keyword2")
)
);
Короче говоря, мне нужен метод, который при двух предикатах возвращает один предикат, составляющий два исходных предиката с предоставленным оператором, но ограниченный операторами, явно поддерживаемыми Linq-to-SQL. Есть идеи?