2013-05-29 3 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

가능한 복제본 [어떻게 동적 'where 절을 linq 쿼리에 추가합니까?] (http://stackoverflow.com/questions/180405/how-do-you-add-dynamic-where-clauses-to -a-linq-query) –

답변

2

지연 실행 덕분에 쿼리를 조건부로 조각으로 만들 수 있습니다.

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 
    } 
} 

가 쿼리를 작성하는 더 나은 방법이있다, 그러나 이것은 간단하다 (그리고 012 :

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

이 작업을해야합니다은 더 나은 이름이 필요합니다.)

@willem 노트에서 나는 가능성이있는 데이터베이스 (db.invites)처럼 보이는 쿼리 포인트를 놓쳤습니다. 그러나 Linq와 Objects 쿼리가 작동하기 때문에 여기에 답을 남깁니다.

관련 문제