2013-02-23 5 views
3

내 메서드에서 expression 매개 변수를 확장하여 자체 필터를 추가하고 싶습니다. 나는 다음과 같은 일을하려고하지만 구문이 잘못되었습니다 :λ 식 매개 변수에서 조건자를 확장하는 방법

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now && predicate) 
} 
컴파일러는이 오류와 함께 비주얼 스튜디오 2012 년에 불평 불평

:

Error 29 Operator '&&' cannot be applied to operands of type ' bool ' and ' System.Linq.Expressions.Expression<System.Func<T,bool>> '

겠습니까이 술어를 연장 먼저 더 나은 .Where(predicate)으로 다시 피드 하시겠습니까? 어떻게 그럴 수 있니?

+0

난 지금,'GetPages을()''IQueryale 을 반환'가정? – svick

+0

예 IQueryable을 반환합니다 – TruMan1

+0

죄송합니다 실제로 IList를 반환했습니다 – TruMan1

답변

4

Would extending the predicate first be better then feed if back as .Where(predicate)? How would you do that?

네가 정확히 제안한 것을 이해하면 그렇습니다. 이 같은 체인 .Where() 수 있습니다

public static IList<MyPage> DoSomething<T>(Expression<Func<T, bool>> predicate) 
{ 
    return DataStore().GetPages().Where(p => p.PublishDate < DateTime.Now).Where(predicate); 
} 
+0

그래,이 특정 경우 (함께 술어를 ANDing), 이것이 최선의 선택입니다. ORing은'PredicateBuilder'와 같은 것이 필요합니다. – svick

+0

시도해 보면 컴파일러 오류가 발생합니다. 'PagesFacade.Where (System.Func )에 대한 최상의 오버로드 된 메서드는 잘못된 인수가 있습니다. – TruMan1

+0

@svick 완전성을 위해,'.Union()'을 사용하면 ORing이 가능하지만 SQL로 변환되고 쿼리가 충분히 복잡 해지면 실제 OR보다 훨씬 나쁜 성능을 보일 수 있습니다. – hvd