2010-06-24 1 views
0

를 사용하여 많은 테이블. 나는 각 테이블에 대한 모든 필드를 검색하고 정렬을 쓰는 것을 피하고 싶다. 그래서 표현식 트리를 사용하고 싶습니다. 쿼리를 동적으로 작성하려고합니다.동적 쿼리 나 사용자가 드롭 다운 목록에서 다음을 선택합니다하는 형태가 식 트리

나는 사용자 입력에 따라 select, whereorderby 방법에 대한 식 트리를 생성하는 일반적인 방법을 쓰고 싶어요. System.Reflection을 사용하여 쿼리중인 Type을 얻을 수 있습니다 (모든 테이블 유형은 LinqToSql을 사용하고 있습니다).

표현식 트리를 구성하는 방법을 모르겠습니다.

private static List<T> GetSortedData<T>(string sortColumnName) 
{ 
     var type = typeof(T); 
     var property = type.GetProperty(sortColumnName); 
     var parameter = Expression.Parameter(type, "p"); 
     var propertyAccess = Expression.MakeMemberAccess(parameter, property); 
     var orderByExp = Expression.Lambda(propertyAccess, parameter); 
     MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, WHAT_SHOULD_BE_HERE, Expression.Quote(orderByExp)); 
     return (List<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

어떻게 select, sortorderby 동적으로 사용하는 식 트리를 구현할 수 있습니다 여기에

는 지금까지이 무엇입니까?

답변

1

당신이 가진 것은 가까이에 있습니다. 어디에서 "WHAT_SHOULD_BE_HERE"를 물어 보면 OrderBy의 "source"매개 변수를 나타내는 데 사용할식이 무엇인지 궁금해합니다.이 매개 변수는 일반적으로 확장 메서드로 사용될 때 피연산자에서 암시됩니다. 필요한 작업은 IQueryable에서 작동하도록 샘플을 변경하는 것입니다. 입력 매개 변수로 받아 들여야합니다. 또한 아래에 표시된 것처럼 WHAT_SHOULD_BE_HERE 자리 표시자를 "list.Expression"으로 대체하십시오.

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

나는 다음 코드를 사용하여이 테스트 : 나는 Order by와 같은 오류에 직면했다

Jane 
John 
+0

어떤 방법입니다 – user145610

0

: 인쇄

static void Main(string[] args) 
{ 
    var list = new List<Person>(new[] 
    { 
     new Person { FirstName = "John" }, 
     new Person { FirstName = "Jane" } 
    }).AsQueryable(); 

    foreach (var o in GetSortedData(list, "FirstName")) 
     Console.WriteLine(o.FirstName); 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
} 

.

은 내가 Call 방법으로 보았다 발견 나는 매개 변수없는 것을 - list.Expression, 목록 정렬에서 여러 열을 가지고 당신의 IQuerable