LINQ로 작업하고 있으므로 LINQ-to-SQL 데이터 컨텍스트에 맞춰 작업하고 있다고 생각하십니까? 이 문제를 테스트하기 위해 여분의 DataContext가 없지만 몇 가지 아이디어가 있어야합니다.
데이터 컨텍스트에 대해 작동하는지는 잘 모르겠지만 대부분이 쿼리가 SQL로 변환 될 때 문제를 일으키지 않아야하는 매우 기본적인 것들 (체인 OR 연산자 및 포함 된 메서드 호출)입니다.
Func<string, Func<DataItem, bool>> buildKeywordPredicate =
keyword =>
x => x.Title.Contains(keyword)
|| x.Contents.Contains(keyword);
이 하나의 문자열 키워드를 소요 한 후있는 DataItem 소요 키워드에 대해 그것을 확인 다른 함수를 반환하는 기능은 다음과 같습니다
먼저 내 술어를 구축 할 사용자 정의 함수를 만듭니다.
기본적으로 "스택"을 전달하면 조건부 : x => x.Title.Contains("Stack") || x.Contents.Contains("Stack")
이 표시됩니다.
가 여러 가지 키워드는 당신이 OR 연산과 체인이 필요하기 때문에 다음, 내가 OR
이 기능은 2 술어를 취
Func<Func<DataItem,bool>, Func<DataItem, bool>, Func<DataItem, bool>> buildOrPredicate =
(pred1, pred2) =>
x => pred1(x) || pred2(x);
다음으로 2 술어 함께 체인에 또 다른 도우미 함수를 만들
그것들을 OR 작업과 결합하십시오.
그 두 기능을 갖는, 그때 구축 할 수 있습니다 내 경우 같은 조건 :
foreach (var word in keywords) {
filter = filter == null
? buildKeywordPredicate(word)
: buildOrPredicate(filter, buildKeywordPredicate(word));
}
필터가 null의 경우 루프 내부의 첫 번째 줄은 기본적으로 확인합니다. 그렇다면 간단한 키워드 필터가 필요합니다.
필터가 null이 아닌 경우 기존 필터를 OR 연산으로 연결해야하므로 기존 필터와 새 키워드 필터를 buildOrPredicate에 전달하여이를 수행합니다.
그리고 우리는 지금 쿼리의 WHERE 부분 만들 수 있습니다
var result = data.Where(filter);
우리가 구축 한 복잡한 조건에 전달합니다.
이것이 PredicateBuilder 사용과 다른지는 모르겠지만 LINQ-to-SQL 엔진으로 쿼리 변환을 연기하기 때문에 아무런 문제가 없어야합니다.
하지만 내가 말했듯이 실제 데이터 컨텍스트와 비교하여 테스트하지 않았으므로 문제가있는 경우 주석에 쓸 수 있습니다. 이 도움이 http://pastebin.com/feb8cc1e
희망 :
는 여기에 내가 시험에 내장 된 콘솔 응용 프로그램입니다!
편집 : 제대로 LINQ에 식 나무를 활용 포함하는 더 일반적인 재사용 가능한 버전에 대한은 토마스 Petricek의 블로그 게시물을 체크 아웃 : http://tomasp.net/articles/dynamic-linq-queries.aspx
이 unfortunatelly 기능에만 작동합니다. Expression Trees로이 작업을하려면 다음과 같은 트릭을 사용해야합니다. http://tomasp.net/articles/dynamic-linq-queries.aspx –
그게 바로 당신이 해낸 위업입니다! 더 awesomeness ... 어쨌든, 난 지금 귀하의 블로그 구독자입니다 :-) – chakrit
고마워,이 하나의 일했습니다. http://tomasp.net/articles/dynamic-linq-queries.aspx - Tomas Petricek – Amir