2013-12-16 1 views
0

는 나는 다음과 같은 코드를 가지고 Expression<Func<IQueryable<T>, IOrderedQueryable<T>>>을 만들 싶어 :식 만들기 <Func <IQueryable <T>, IOrderedQueryable <T> >>?

Expression selector = q => q.RegistrationDate 

MethodInfo orderByMethodInfo = typeof(Queryable).GetMethods().First(method => method.Name == "OrderBy" && method.GetParameters().Count() == 2).MakeGenericMethod(argumentTypes); 
MethodInfo orderByDescMethodInfo = typeof(Queryable).GetMethods().First(method => method.Name == "OrderByDescending" && method.GetParameters().Count() == 2).MakeGenericMethod(argumentTypes); 

나는 거 위의 코드에서 c => c.OrderByDescending(q => q.RegistrationDate).ThenBy(q=>q.Name) 같은 c => c.OrderBy(q => q.RegistrationDate) 또는 c => c.OrderByDescending(q => q.RegistrationDate) 또는 일반적으로 무언가를 만들 수 있어요.

내가 어떻게 할 수 있는지 안내해 주시겠습니까? T

+1

당신은이에 대한 [LINQKit] (http://www.albahari.com/nutshell/linqkit.aspx) 사용할 수 있습니다. – svick

+0

어떻게? 더 자세히 설명해 주시겠습니까? –

답변

2
var paramExpr = Expression.Parameter(typeof(IQueryable<T>)) 
var orderByExpr = Expression.Call(orderByMethodInfo, paramExpr, selector); 
var expr = Expression.Lambda<Func<IQueryable<T>, IOrderedQueryable<T>>>(orderByExpr, paramExpr); 

selector 표현의 RegistrationDate 속성 유형입니다.

당신은 MakeGenericType를 사용하여 인수 유형에서 쿼리 가능한 유형을 얻을 수 있습니다 :

Type argType = typeof(DateTime); 
Type queryableType = typeof(IQueryable<>).MakeGenericType(argType); 
+0

응답 해 주셔서 감사합니다. 그러나 첫 번째 줄에서 Type으로부터'IQueryable <> '을 어떻게 만들 수 있습니까? 예 : 저는 DateTime과 같은 T 타입을 가지고 있습니다. 어떻게 동적으로 IQueryable 을 만들 수 있습니까? –

+2

@ 모함마드 -'MakeGenericType'을 사용할 수 있습니다. – Lee