2011-05-02 5 views
1

엔티티 프레임 워크 쿼리에서 사용할 표현식을 만들려고합니다. 나는 두 표현식 생성 :두 표현식을 결합하십시오.

public Expression<Func<IEntityPriceDefinition, bool>> IsMatchExpression(long additionId) 
    { 
     return x => x.PriceDefinition.AdditionsPrices.Any(a => a.AdditionId == additionId); 
    } 
public Expression<Func<IEntityPriceDefinition, bool>> IsMatchExpression(
    long? inviterId, long? routeId, long? luggageTypeId) 
{ 
    return x => 
     (inviterId.HasValue || routeId.HasValue || luggageTypeId.HasValue) && 
     !(
      (x.PriceDefinition.InviterId.HasValue && inviterId.HasValue && 
       PriceDefinition.InviterId.Value != inviterId.Value) || 

      (PriceDefinition.LuggageTypeId.HasValue && luggageTypeId.HasValue && 
       PriceDefinition.LuggageTypeId.Value != luggageTypeId.Value) || 

      (PriceDefinition.InviterId.HasValue && inviterId.HasValue && 
       PriceDefinition.InviterId.Value != inviterId.Value) 
     ); 
} 

그리고 지금은 그들을 결합 기꺼이 :

public Expression<Func<IEntityPriceDefinition, bool>> IsMatchExpression(
     long? inviterId, long? routeId, long? luggageTypeId, long additionId) 
    { 
     return IsMatchExpression(inviterId, routeId, luggageTypeId) && 
       IsMatchExpression(additionId); 
    } 

를이 방법은 컴파일하지 않습니다. 나는 또한 내가 뭔가 잘못했다고 생각합니다. 어떻게 해결할 수 있습니까?

편집 :
내가 잊어 버린 부분! 질문이 업데이트되었습니다.

+2

없이, 부울을 반환해야합니다 참조? – Nicolas78

+0

@ Nicolas78 : 두 표현식을 결합하는 표현식을 만들어야합니다. – Naor

+0

아 좋아. 여기에 쓰는 것은 두 표현식을 모두 평가하고 두 표현식이 모두 충족되는지 여부에 따라 true 또는 false를 반환하려고 시도합니다. 어쩌면 우리는 더 나은 당신을 도울 수 있도록 이러한 MatchExpressions 및 사용 사례에 대해 조금 말할 수 있습니다. – Nicolas78

답변

0

방금 ​​만든 결합 방법

public Expression<Func<IEntityPriceDefinition, bool>> IsMatchExpression(
     long? inviterId, long? routeId, long? luggageTypeId, long additionId) 
    { 
    return x => 
     (inviterId.HasValue || routeId.HasValue || luggageTypeId.HasValue) && 
     (x.PriceDefinition.AdditionsPrices.Any(a => a.AdditionId == additionId)) && 
     !(
      (x.PriceDefinition.InviterId.HasValue && inviterId.HasValue && 
       PriceDefinition.InviterId.Value != inviterId.Value) || 

      (PriceDefinition.LuggageTypeId.HasValue && luggageTypeId.HasValue && 
       PriceDefinition.LuggageTypeId.Value != luggageTypeId.Value) || 

      (PriceDefinition.InviterId.HasValue && inviterId.HasValue && 
       PriceDefinition.InviterId.Value != inviterId.Value) 
     ); 
} 

하지 최상의 솔루션지만 작동합니다.

0

확인이

var x = IsMatchExpression(inviterId, routeId, luggageTypeId) 
var y = IsMatchExpression(additionId); 
return arg => x(arg) && y(arg) 

같은 STH 될 수 있을까?

+0

추가 구문 부두가 필요할 수도 있습니다. Expression 인터페이스에 익숙하지 않습니다. 요점은 함수 내에서 그 함수를 호출하는 것과 함수를 호출하는 것 사이의 차이점이다. 나중에 λ3을 반환 할 람다 함수를 반환한다. 나중에 – Nicolas78

+0

에이 값이 작동하지 않는다. 나는 Expression 인터페이스를 잘못 사용하고 있다고 생각한다. 이것은 엔티티 프레임 워크 쿼리에 대한 표현식을 만드는 방법이라고 확신하지 못합니다. – Naor

+0

정확하게 "작동하지 않는다"는 것은 무엇을 의미합니까? (오류 메시지 등)? 이 줄의 – Nicolas78

1

이렇게하려면 표현식 구성 요소를 직접 사용해야합니다.

public Expression<Func<IEntityPriceDefinition, bool>> IsMatchExpression(
     long? inviterId, long? routeId, long? luggageTypeId, long additionId) 
{ 
    var a = IsMatchExpression(inviterId, routeId, luggageTypeId); 
    var b = IsMatchExpression(additionId); 
    var p = Expression.Parameter(typeof(IEntityPriceDefinition),"x"); 
    var c = Expression.AndAlso(Expression.Invoke(a,p),Expression.Invoke(b,p)); 
    var r = Expression.Lambda<Func<IEntityPriceDefinition, bool>>(c,p); 
    return r; 
} 

이것은 두 식의 각각으로부터 .Body을 끊고 새로운 파라미터와 함께 파라미터 (AN ExpressionVisitor 사용)로 대체하여보다 정교한 제조 될 수있다; 각각의 작업 방법을 변경하여 매개 변수를 ConstantExpression s에 바인딩하여 람다 식 구문을 모두 잃어 버릴 수 있습니다. 이러한 변경은 엔티티 프레임 워크에서 제대로 작동 할 수있는 표현식을 작성하는 데 실제로 필요할 수 있습니다. 그러나 이것은 답변에 게시하기까지 다소 시간이 걸릴 것입니다.

How can I compose an Entity Framework query from smaller, resusable queries?

+0

예외가 발생했습니다 : 'System.Func'2 [IEntityPriceDefinition, System.Boolean] 형식의 식은 반환 형식'System.Boolean '에 사용할 수 없습니다. – Naor

+0

어떤 라인에 오류가 있습니까? – Random832

+0

어디에서 lambda를 만들려고 했습니까? var r = Expression.Lambda > (c, p); – Naor

관련 문제