2011-03-25 5 views
4

검색 아래 코드 스 니펫을 사용하면 테이블의 세 필드와 문자열을 비교할 수 있습니다. 일치하는 필드가 있으면 항목이 결과에 포함됩니다. 그러나 Where를 사용하여 결과를 필터링하면 "문자열이 세 필드 모두와 일치해야합니다"대신 "문자열이 세 필드 중 하나와 일치 할 수 있습니다"라는 결과가 발생합니다.Linq - LINQ 쿼리를 동적으로 작성할 때 OrWhere 식을 시뮬레이트 하시겠습니까?

동적으로 LINQ 쿼리를 작성할 때 OrWhere 식을 시뮬레이트하는 방법이 있습니까?

var foundUsers = from UserInfo user in entities.UserInfo 
       select user; 

if (searchCompleteName) 
{ 
    foundUsers = foundUsers.Where(u => u.CompleteName.Contains(searchString)); 
} 

if (searchPortalID) 
{ 
    foundUsers = foundUsers.Where(u => u.PortalID.Contains(searchString)); 
} 

if (searchUsername) 
{ 
    foundUsers = foundUsers.Where(u => u.UserIdentity.Contains(searchString)); 
} 

추신. Entities Framework 및 LINQ to Entities를 사용하고 있으며 MVC3 웹 응용 프로그램을 만들고 있습니다.

답변

6

이보십시오.

var foundUsers = entities.UserInfo.Where(u => 
    (searchCompleteName && u.CompleteName.Contains(searchString)) 
    || (searchPortalID && u.PortalID.Contains(searchString)) 
    || (searchUsername && u.UserIdentity.Contains(searchString)); 

노조로 이것을 수행 할 수도 있습니다. 조합 연산자는 별개의 결과를 반환하므로 중복 된 결과는 없습니다. EF가 이것을 데이터베이스로 연기 할 수 있는지는 잘 모르겠습니다.

var foundUsers = Enumerable.Empty<UserInfo>().AsQueryable(); 

if (searchCompleteName) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.CompleteName.Contains(searchString))); 
} 

if (searchPortalID) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.PortalID.Contains(searchString))); 
} 

if (searchUsername) 
{ 
    foundUsers = foundUsers.Union(entities.UserInfo.Where(u => u.PortalID.Contains(searchString))); 
} 
+0

'.AsExpandable을 필요로하지 않는 대안도 참조 내 [블로그 게시물 (http://blog.abodit.com/2013/02/creating-and-or-expressions-linq/)()'. –

관련 문제