Как передать динамически сгенерированные критерии поиска в LINQ - PullRequest
2 голосов
/ 03 августа 2011

У меня проблемы с LINQ. В моей программе я генерирую поисковый запрос SQL, например

select * from emp "where empId=1 and empname='abc'"

(где цитируемый текст генерируется в моем коде). Я могу передать сгенерированный текст строки "where empId ..." в запрос SQL.

Я хотел бы сделать то же самое в LINQ - я хочу передать эту строку в качестве критерия поиска, то есть что-то вроде

var employee=from a in Employee.AsEnumerable()
             "where empId=1 and empname='abc'"
              select a;

Возможно ли это? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Вы можете взять базовый запрос (в вашем случае Employee.AsEnumerable ()) и использовать логику, которую вы используете, чтобы сгенерировать строку для составления нового запроса. Например:

if(/*your logic for generating the string "where empId=1" here*/)
{
    query = query.Where(a.empId == 1);
}

if(/*your logic for generating the string "empname='abc'" here*/)
{
    query = query.Where(a.empname == "abc");
}

Полученный объект запроса будет содержать все операторы. Однако, как говорили другие, это не тривиально в общем случае. Это не тривиально со строками SQL либо. Если все, что вам нужно для генерации, это несколько фильтров, то это сработает, но если вам нужны сложные выражения, это будет проблемой.

0 голосов
/ 03 августа 2011

Это довольно сложно, если вы не собираетесь использовать:

  • Динамическая компиляция кода, или
  • Вы готовы создать (очень сложный) парсер для анализа запроса и вызова соответствующих методов расширения linq

У меня лично нет опыта в последнем. Что касается первого, это немного сложно и может пойти не так, как надо, если вы не выполняете надлежащее кэширование и проверки безопасности. Внедрение исполняемого кода очень опасно.

Я думаю, что вам лучше использовать разные методы для фильтрации контента, используя такие методы, как Where(), если количество запросов можно предопределить, или вернуться к SQL, если нет. Обычно вам не нужно это делать, если пользователь не вводит запрос вручную.

0 голосов
/ 03 августа 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...