(Предыдущий вопрос, Рекурсивное (?) Объединение предикатов LINQ в один предикат , аналогичен этому, но на самом деле я задал неправильный вопрос ... решение там удовлетворило поставленный вопрос, нона самом деле это не то, что мне нужно. Но они разные. Честно.)
Учитывая следующий текст поиска:
"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.
IЯ делаю это в 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.Есть идеи?