2010-12-31 5 views
6

누구든지 Linq.Dynamic 네임 스페이스에 익숙하다면 도움이 될 수 있습니다. 인터넷에서 충분한 리소스를 찾을 수 없습니다. QueryFilter 내가 유형이 컴파일 타임에 알 수없는 수식을 만듭니다 DynamicExpression.ParseLambda을 사용하고 기본적으로알 수없는 유형의 DynamicExpression 실행

,

public Expression GetExpression(Type t, List<QueryFilter> filters) 
{ 
    // pseudo code 
    // extracts a string representation of the query as 'expressionString' 

    return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values); 
} 

인 경우 : 간단한 바이너리를 나타냅니다

public class QueryFilter 
{ 
    string propertyName; 
    ExpressionType operationType; 
    object value; 
} 

기능은 "Age> 15"또는 그와 비슷한 것입니다.

이것은 'GetExpression'기능이 작동하는 방식으로 입력 유형과 출력 유형 인 두 가지 유형이 필요하며 일반적으로 Func 대리인을 사용하여 일반적으로 생성되는 것을 생성합니다. 또한 쿼리를 나타내는 문자열과 위의 'expressionString'및 'values'값인 params 객체 []를 사용합니다.

그러나 SqlMetal (.dbmc 파일)에서 생성 된 DataContext를 사용하여 LINQ-to-SQL에서 동적 표현식을 실행하는 데 문제가 있습니다.

DatabaseContext db = new DatabaseContext(connectionString); 

var filter = DynamicExpressionBuilder. 
     GetExpression(typeof(SysEventLogT), sysEventFilters) 

var query = db.SysEventLogT.Where(filter); 

다음과 같은 오류를 생성,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT> 

는 '어디'에 대한 정의 및

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 

일부 잘못된 인수가 최고의 확장 메서드 오버로드를 포함하지 않습니다.

내 DataContext 인스턴스가 실제로 SQL 테이블을 속성으로 취급한다는 것을 알고 있습니다 ... GetProperty()를 사용하여이를 반영해야합니까? 또는 다른 것을 만들 필요가 있습니다. 어디서 확장합니까?

답변

2

GetExpression은 표현식 유형을 반환합니다. DynamicQueryable.Where 메서드는 확장 메서드로 사용될 때 문자열을 첫 번째 매개 변수로 사용합니다. , 당신은 단지 명시 적으로 다음을 시도 할 수 있습니다 또한

var query = db.SysEventLogT.Where("Age > @0", 15); 

: 쉽게, 당신이 만들 수 있다면 것을

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

참고

당신은 다음과 같이하는 경우에 전화를해야합니다 전체 필터를 포함하고 params object [] 매개 변수를 전혀 사용하지 않는 스팅 :

관련 문제