2014-09-15 2 views
0

엔티티가 있습니다.Combining AndAlso 매개 변수 'foo'가 지정된 LINQ to Entities 쿼리 식에 바인딩되지 않았습니다.

public class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Code { get; set; } 
} 

내 자신의 표현식을 만들고 싶습니다. 이를 위해 속성 이름과 값을 받아들이는 메서드를 만들었습니다.

private static Expression<Func<Foo, bool>> Condition(string pName, object value) 
{ 
    var pe = Expression.Parameter(typeof(Foo), "foo"); 
    var left = Expression.Property(pe, pName); 
    var right = Expression.Constant(value); 
    var equal = Expression.Equal(left, right); 
    var predicate = Expression.Lambda<Func<Foo, bool>>(equal, pe); 
    return predicate; 
} 

이것은 단일 조건에 대해 잘 작동하는 술어입니다.

using (var db = new MyEntities()) 
{ 
    var predicate = Condition("Name", "foo"); 
    var foos = db.Foos.Where(predicate).ToArray(); 
} 

그러나 두 조건을 this post에 따라 결합하려고 시도하면 예외가 발생합니다.

매개 변수 'foo'가 지정된 LINQ to Entities 쿼리 식에 바인딩되지 않았습니다.

using (var db = new MyEntities()) 
{ 
    var cond1 = Condition("Name", "foo"); 
    var cond2 = Condition("Code", "bar"); 
    var body = Expression.AndAlso(cond1.Body, cond2.Body); 
    var predicate = Expression.Lambda<Func<Foo,bool>>(body, cond1.Parameters[0]); 
    var foos = db.Foos.Where(predicate).ToArray(); // exception 
} 

가르치 려하시기 바랍니다.

답변

3

LINQ 식의 ParameterExpression은 참조 동등성으로 식별되지만 두 개의 Parameter 개체는 다른 참조입니다. (name in ParameterExpression은 디버깅 목적으로 만 존재합니다).

(위에서 언급 한 게시물을 다시 읽으면 시도한 방법은 두 람다 모두 동일한 ParameterExpression 개체에 정의 된 경우에만 작동합니다).

이 단계에서 두 개의 큰 가능성을 가지고 : 중 당신은 Condition 함수는 ParameterExpression 객체를 받아 들일 수, 또는 다른 원래 ParameterExpression를 대체 할 것 ExpressionVisitor을 만들 수있는 방법을 정의합니다. (물론 AndAlso을하고 싶다고 가정하면 두 개의 Where 절을 연결할 수도 있습니다.)

+0

감사합니다. 따라서 expression 매개 변수를 메서드 매개 변수로 사용 하시겠습니까? 나는 그것을 지금 시도 할 것이다. – tsuta

+0

@tsuta : 그 방법 중 하나입니다. 또 다른 방법은 매번 동일한 매개 변수 객체를 재사용 할 객체로 람다 표현식 작성 프로세스를 캡슐화하는 것입니다. 'ExpressionVisitor'를 사용하는 것은 더 복잡 합니다만, 생성 된'Expression' 객체를 제어하지 않는다면 그것을하는 주된 방법이 될 것입니다. –

+0

설명을 주셔서 감사합니다. 나는 여전히 표현을 배우고 있으며, 술어를 만드는 방법에 대해 정말로 관심이 있습니다. 표현 방문자를 나중에 사용하려고합니다.하지만 지금은 내 표현을 완전히 제어 할 수 있기 때문에 현재는 요구 사항을 다루고 있습니다. – tsuta