2012-09-20 3 views
2

EF를 사용하여 db를 검색하는 쿼리를 만듭니다. TdsDb는 EF 컨텍스트입니다.엔티티 프레임 워크 : 검색어에 조건부 검색 및 조건부 일치 검색

string searchValue = "Widget"; 
TdsDb tdsDb = new TdsDb(); 
IQueryable<Counterparty> counterparties; 

내가 정확히 일치 할 수 있습니다

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName == searchValue); 

또는 와일드 카드 일치 :

counterparties = tdsDb.Counterparties.Where(x => x.CounterpartyName.Contains(searchValue)); 

을하지만

counterparties = tdsDb.Counterparties.Where(x => 
      if (searchValue.EndsWith("%")) 
       { 
         if (searchValue.StartsWith("%")) 
          {x.CounterpartyName.Contains(searchValue)} 
         else 
          {x.CounterpartyName.StartsWith(searchValue)} 
       } 
      else 
       {x => x.CounterpartyName == searchValue} 
    ); 
모두 예 (psudo 코드를) 할 수 있도록하려면

이제 명확하게 if 문을 w에 넣을 수 없습니다. 그런 조항이 여기에 있습니다. 그러나 나는 또한 질의를 복제 할 수 없다 : 여기에 표시된 것은 엄청나게 무언가를 버렸다는 것이다. 프로덕션 쿼리는 훨씬 길어서 하나의 절에서만 변하는 동일한 긴 쿼리의 여러 버전을 갖는 것이 매우 건강에 좋지 않고 유지 보수가 불가능한 것처럼 보입니다.

아이디어가 있으십니까?

bool startsWithWildCard = searchValue.StartsWith("%"); 
bool endsWithWildCard = searchValue.EndsWith("%"); 

counterparties = tdsDb.Counterparties.Where(x => 
     endsWithWildCard 
      ? (startsWithWildCard 
       ? x.CounterpartyName.Contains(searchValue) 
       : (x.CounterpartyName.StartsWith(searchValue))) 
      : (x.CounterpartyName == searchValue)); 

당신이 경우 시작 부분에 %가 있거나 예상대로 끝이 작동하는 searchValue에 의해 쿼리 BTW 테스트나요 : 당신은 삼항 연산자를 사용할 수 있어야

답변

1

? 어쨌든 StartsWithContains은 생성 된 SQL 검색어에 앞에 % 와일드 카드를 추가/추가 할 것이므로 %은 쿼리 할 문자로 이스케이프 처리 될 수 있습니다. 이 경우 StartsWith 또는 Contains에 전달하기 전에 searchValue에서 %을 잘라야합니다.

+1

Ternaries, 그들은 결코 이제까지 최고의 것이지 않을 것입니까? 고맙다 Slauma, 그 작품과 옙, 나는 와일드 카드의 제거를 허용했다. 매우 유용합니다. 대단히 감사합니다. – Matt

관련 문제