linq 메소드의 이름과 속성의 이름을 전달하는 함수에서 표현 트리를 사용하여 iqueryable에서 linq 메소드를 실행하려고합니다. 하지만 내 예제 메서드는 매핑 된 속성에서만 작동합니다. 예를 들어 계산 된 속성의 최대 값을 찾으려고 할 때 예외가 발생합니다.Entity Framework에서 매핑 된 속성이없는 쿼리를 실행합니다. 표현 트리
내 클래스 :
public partial class Something
{
public int a { get; set; }
public int b { get; set; }
}
public partial class Something
{
public int calculated { get { return a * b; } }
}
샘플 방법 :
이1) 계산 저장 :
public static object ExecuteLinqMethod(IQueryable<T> q, string Field, string Method)
{
var param = Expression.Parameter(typeof(T), "p");
Expression prop = Expression.Property(param, Field);
var exp = Expression.Lambda(prop, param);
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = Expression.Call(typeof(Queryable),Method,types,q.Expression,exp);
return q.Provider.Execute(mce);
}
왜 표현식 트리를 사용하면 EF 쿼리 공급자가 지원하지 않는 작업을 수행 할 수 있다고 생각합니까? –
매핑 된 속성과 매핑되지 않은 속성의 최대, 최소, 합계 등을 찾기 위해 보편적 인 방법이 필요합니다. 이 메소드의 파라미터로서 지정된 함수 명과 프로퍼티 명을 지정합니다. 그것은 표현 트리 또는 다른 방법으로 수행 할 수 있습니다. –
그런 다음 "다른 방법"을 먼저 찾은 다음 필요한 경우 표현 트리 도움말을 요청하십시오. 주요 문제는 필드가 매핑되는지 아닌지를 결정하는 방법입니다. 그리고 계산 된 속성이 사용하는 것을 알 수있는 방법이 없기 때문에 실행하는 유일한 방법은'IEnumerable'에 대해 실행하는 것입니다. –