엔티티가 있습니다.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
}
가르치 려하시기 바랍니다.
감사합니다. 따라서 expression 매개 변수를 메서드 매개 변수로 사용 하시겠습니까? 나는 그것을 지금 시도 할 것이다. – tsuta
@tsuta : 그 방법 중 하나입니다. 또 다른 방법은 매번 동일한 매개 변수 객체를 재사용 할 객체로 람다 표현식 작성 프로세스를 캡슐화하는 것입니다. 'ExpressionVisitor'를 사용하는 것은 더 복잡 합니다만, 생성 된'Expression' 객체를 제어하지 않는다면 그것을하는 주된 방법이 될 것입니다. –
설명을 주셔서 감사합니다. 나는 여전히 표현을 배우고 있으며, 술어를 만드는 방법에 대해 정말로 관심이 있습니다. 표현 방문자를 나중에 사용하려고합니다.하지만 지금은 내 표현을 완전히 제어 할 수 있기 때문에 현재는 요구 사항을 다루고 있습니다. – tsuta