2011-08-24 2 views
4

다음 코드 :동적 OR 구문을 사용하여 Linq 쿼리를 작성하려면 어떻게해야합니까?

var dynamicQuery = from a in _context.Users select a; 
string[] args = new string[] { "aa", "bb", "cc" }; 
foreach (string word in args) 
    dynamicQuery = dynamicQuery.Where(x => x.Name.Contains(word)); 
return dynamicQuery.ToList(); 

표현의 동적 목록이있는 LINQ 쿼리를 만들 수 있습니다.

그러나 동적 목록 인 또는 표현식 만 사용하고 싶다고 가정 해 보겠습니다.

답변

6

당신은 모든 루프 필요가 없습니다

return _context.Users.Where(x => args.Any(word => x.Name.Contains(word))); 

이 편집 : 더 일반적으로, 당신은 사용할 수 있습니다

Func<User, bool> predicate = user => false; 
foreach (var item in items) 
{ 
    var predicateCopy = predicate; 
    predicate = user => predicateCopy(user) || someOtherCondition; 
} 
return query.Where(predicate); 

이 하나의 위임 호출에 매우 깊은 스택 (끝낼 것 다른 다른 전화 등). 특정 상황에서 Any을 사용할 수있는 경우 일반적으로 더 나은 접근 방법입니다.

나는 Any이 잠재적으로 일치하는 아이템의 모음을 가지고있는 대부분의 상황에서 작동 할 것으로 기대합니다 ... Any 접근 방식은 "일부 상황에서는 18 세 이상이 괜찮습니다 ... 어떤 상황에서는 성이 "G"로 시작하는 사람이 적합합니다.

+0

이 특정 시나리오에 대한 대답은 있지만 더 일반적인 접근 방법이 있습니까? – sternr

+0

@sternr : 편집 할 것입니다 ... –

+0

그건 내 처음이었습니다. 생각,하지만 이전의 Func 대신 술어 자체를 호출하는 것처럼 stackoverflow 예외를 제공합니다 – sternr

관련 문제