LINQ Query с динамическим числом логических AND - PullRequest
1 голос
/ 27 августа 2010

Я работаю над поисковой веб-страницей для моего сайта.Требования гласят, что пользователи могут вводить текст для любой комбинации из 9+ полей, и при поиске в базе данных поиск должен соответствовать 'И'.Я мог бы довольно быстро написать это как хранимую процедуру, используя ISNULL, но я пытаюсь понять, как выполнить то же самое в LINQ.Я думал, что могу запросить результаты запроса , но я получаю сообщение об ошибке

"Для String.Contains поддерживаются только аргументы, которые могут быть оценены на клиенте.method "

Вот мой пример

var people = db.People

if(null != fname)
{
people= from e in people
   where e.FirstName.Contains(fname)
   select e;
}

if(null != lname)
{
people= from e in people
   where e.LastName.Contains(lname)
   select e;
}

return people;

Могу ли я запросить набор результатов предыдущего запроса?Есть ли лучший подход, о котором я просто не думаю?

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 27 августа 2010

Это должно сделать это:

var people = db.People;
if(!String.IsNullOrEmpty(fname))
    people = people.Where(p => p.FirstName.Contains(fname));
if(!String.IsNullOrEmpty(lname))
    people = people.Where(p => p.LastName.Contains(lname));
return people;
3 голосов
/ 27 августа 2010

Иногда я выполняю то же самое в меньшем количестве строк, напрямую вызывая методы расширения:

var people = from e in db.People select e;

if(null != fname)
{
   people = people.Where(e => e.FirstName.Contains(fname));
}

if(null != lname)
{
    people = people.Where(e => e.LastName.Contains(lname));
}

return people;
3 голосов
/ 27 августа 2010

Как определяются ваши fname и lname?

Вы должны посмотреть на PredicateBuilder здесь - особенно если вы также хотите OR в какое-то время:

http://www.albahari.com/nutshell/predicatebuilder.aspx

2 голосов
/ 27 августа 2010

Это должно работать и кажется проще:

people = from e in db.People
    where (lname == null || e.LastName.Contains(lname))
       && (fname == null || e.FirstName.Contains(fname))
    select e;

В коде, который вы предоставили, нет ничего очевидного, так как нет причины, по которой вы не можете запросить результаты другого запроса. Похоже, что fname или lname определены каким-то образом, который не понимает генератор SQL.

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