0

내가 술어 빌더를 데하고 노력하고 내가 지금은 조건을 추가 할 수 있도록 다른 술어 빌더로 임명 안에 조건을 분할하려고식으로 두 개의 서로 다른 PredicateBuilders을 결합

var filter = sortKeys.Aggregate(filter, (currentFilter, sortkey) => currentFilter.Or(
          x => x.Appointments.Any(y => y.RowStatus == Constants.CurrentRowStatus))); 

잘 이동하고 기능을 재사용하십시오.

내가 표현을 만든 다음 주 술어 빌더를 사용하여 시도했다 그러나 위의 표현을 사용하는

private static Expression<Func<Appointment, bool>> TmpApt(string status) 
    { 
     var predicate = PredicateBuilder.False<Appointment>(); 

     predicate = predicate.Or(p => p.RowStatus == status); 

     return predicate; 
    } 

변경된 주요 술어를 실패

var filter = sortKeys.Aggregate(PredicateBuilder.True<Person>(), (current, s) => 
           current.Or(x => x.Appointments.Any(TmpApt(s)))); 

그것은 오류를 보여주는 그

인수 유형 'System.Linq.Expressions.Expression<System.Func<Appointment,bool>>'은 이 아니며 assignabl입니다. e에서 매개 변수 유형 System.Func<Appointment,bool>

심지어 확장과 같은 LinqKit 확장 방법을 시도했지만 해결책을 찾을 수있었습니다.

또한 어플리케이션 측에서 그 질의 운영자 Any '사용

지원되지 않는 오버를 나타내는 경우 컴파일하지만시키면서이 오류를 표시하지 않고, Reusable predicate expressions in LINQ을 시도했다.

누구든지 오류 해결 방법을 제안하거나 다른 해결책을 제안 할 수 있습니까?

답변

1
당신은 당신이 원하는 위치에서이 식을 호출 할 LINQKit을 사용할 수 있습니다

는 그것을 사용한다 : 당신이해야합니다

var predicate = TmpApt(); 
var filter = sortKeys.Aggregate(PredicateBuilder.False<Person>(), 
    (current, s) => current.Or(x => 
     x.Appointments.Any(appointment => predicate.Invoke(appointment)))) 
     .Expand(); 

참고 성공적으로 LINQKit 위해 밖으로 변수에 TmpApt 당겨 그것의 구현의 버그로 인해 그것을 평가하십시오.

True 또는 true이 ORDEed되어 있기 때문에 집계 연산을 False으로 초기화해야합니다.

private static Expression<Func<Appointment, bool>> TmpApt() 
{ 
    return p => p.RowStatus == Constants.CurrentRowStatus; 
} 

여기 FalseOr에 술어 빌더를 사용할 필요가 없습니다 :

또한 그냥 다음에 TmpApt의 구현을 단순화 할 수 있습니다.

+0

대단히 감사합니다 ... 당신의 솔루션은 훌륭하게 작동하지만 새로운 문제가 생겼습니다. TmpApt()에 매개 변수를 전달하고 싶습니다. 매개 변수 값은 "s"(집계에 있음)에서옵니다. 변수로 선언 한 다음 호출 할 때 전달하는 방법을 모르겠습니다. 이 문제를 해결할 수있는 방법이 있습니까? 주요 질문도 업데이트 할 것입니다. 미안하지만 내 실수 였어. T. 메서드의 변수를 제거했는지 쉽게 질문하게하십시오. 도와 주셔서 대단히 감사합니다. – Rocky

+0

@Rocky 음 가장 간단한 옵션은'TmpApt'의 호출을'Aggregate' 람다에 리팩토링하는 것입니다.당신이 LINQKit에서 버그를 수정하고 싶지 않다면, 식으로 컴파일 된 람다 안에있을 수는 없습니다. 이것은 가능하지만 간단하지는 않습니다. – Servy

관련 문제