2013-05-29 4 views
0

Я пытаюсь использовать Linq для запроса базы данных из пользовательского элемента поиска.Использование linq для фильтрации поиска

У меня есть этот запрос Linq, который выполняет поиск в базе данных с помощью ввода пользователем.

Это код, который я сейчас использую:

var query = from invite in db.invites 
      where invite.Division == userInput.Division.Text && 
        invite.Status == userInput.Status.Text 
      select invite; 

У меня есть проблема в том, что если ни одна пустая мне нужно не принимать его во внимание для поиска фильтра. Есть ли способ сделать это правильно, учитывая, что у меня много фильтров, а не только статус и разделение?

+1

Возможный дубликат [Как добавить динамические предложения «где» к запросу linq?] (Http://stackoverflow.com/questions/180405/how-do-you-add-dynamic-where-clauses-to -a-linq-query) –

ответ

2

Благодаря отсроченному исполнению вы можете условно построить запрос на куски.

var query = db.invites.AsQueryable(); 

if(!string.IsNullOrEmpty(userInput.Division.Text)) 
    query = query.Where(invite => invite.Division == userInput.Division.Text); 

if(!string.IsNullOrEmpty(userInput.Status.Text)) 
    query = query.Where(invite => invite.Status== userInput.Status.Text); 
0
var query = from invite in db.invites 
     where invite.Division.Contains(userInput.Division.Text) && 
       invite.Status.Contains(userInput.Status.Text) 
     select invite; 

или

var query = from invite in db.invites select invite; 
if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Division == userInput.Division.Text); 
if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Status == userInput.Status.Text); 
+0

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

+0

Ваше право, хотя что-то о его вопросе говорит мне, что он может искать именно это решение. – ikwillem

+0

, который выглядит вполне возможным –

1

Это должно работать:

var query = from invite in db.invites 
     where invite.Division.Matches(userInput.Division.Text) && 
       invite.Status.Matches(userInput.Status.Text) 
     select invite; 

static class Extensions 
{ 
    public static bool Matches(this string text, string value) 
    { 
     if(string.IsNullOrEmpty(value)) return true; 
     return text == value; // or same safer comparison 
    } 
} 

есть лучшие способы построения запросов, но это просто (и Matches нуждается в лучшем имени).

Как отмечает @willem, я пропустил точку выполнения запроса в базе данных, которая кажется вероятной (db.invites). Однако я оставляю ответ здесь, поскольку он работает для запросов Linq to Objects.

Смежные вопросы