2010-03-19 2 views
0

여러 가지 메소드로 일반 저장소를 구현했습니다. 그 중 하나는 이것이다 :동적 표현 트리 방법

가이 같은이 전화를 쉽게 <Culture>을 할 <T>을 감안할 때
public IEnumerable<T> Find(Expression<Func<T, bool>> where) 
     { 
      return _objectSet.Where(where); 
     } 

: quering 이런 종류의 "에만 제한되어

Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ; 

return cultureRepository.Find(whereClause).AsQueryable(); 

을하지만 지금은 (실현)를 참조하십시오 하나의 기준으로 " 내가 원하는 것은 다음과 같습니다.

위의 예에서 c는 Culture 유형입니다. Culture는 CultureId, Name, Displayname과 같은 여러 속성을 가지고 있습니다 ... CultureId> 4 및 Name.contains ('de') 및 다른 실행 Name.contains ('us') 및 Displayname .contains ('ca') 및 ....

이러한 쿼리는 동적으로 만들어야합니다. Expression Tree에서 한 번 보았습니다. (제 문제에 대한 해결책으로 생각했습니다. 전에 사용하지 않았지만) 제 요구 사항을 가리키는 것을 찾을 수 없었습니다.

어떻게 비용을 절감 할 수 있습니까? 사전에

덕분에

답변

0

Codeka 한이 제한에 대해 나에게 다시 생각 내 문에 대한 힌트를 준 매개 변수.

모두 값을 가진 속성을 사용하여 시나리오를 구현하는 것이 매우 쉽습니다. 예를 들어, Cutlure 유형은 3 곳

로 정의 된 경우

이름 문자열

표시 이름 문자열

CultureId의 INT 일이

Expression<Func<Culture, bool>> whereClause = c => (
       (!String.IsNullOrEmpty(FilterCulture.Name) ? c.Name.Contains(FilterCulture.Name) : true) && 
       (!String.IsNullOrEmpty(FilterCulture.Displayname) ? c.Displayname.Contains(FilterCulture.Displayname) : true) && 
       (FilterCulture.CultureId > 0 ? c.CultureId == FilterCulture.CultureId : true) 
       ); 

같은 필터 표현을 구현할 수있는 것보다

보시다시피, 각 속성 사이에 & & 연산자를 사용하여 결과 (하나는 || 결과를 넓히기 위해 - 따라서 OR을 구현하십시오.)

다시 한 번 코드 카!

0

당신은 특별한 아무것도 할 필요가 없습니다, 다음 작동합니다 :

var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de")); 
+0

나는 내 초기 게시물에서 명확하지 않았다고 생각한다. 내가 나온 해결책 좀 봐. –