2013-12-16 76 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.OrderBy(q => q.RegistrationDate)c => c.OrderByDescending(q => q.RegistrationDate)或一般類似c => c.OrderByDescending(q => q.RegistrationDate).ThenBy(q=>q.Name)從上面的代碼。

請你指導我如何做到這一點?

+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); 

哪裏T是在你的selector表達RegistrationDate屬性的類型。

您可以使用MakeGenericType參數的類型得到查詢類型:

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

感謝您的迴應。但是在第一行中,我如何從Type創建'IQueryable <>''。例如:我有類型的T(不是泛型)作爲DateTime,我如何動態創建'IQueryable '? –

+2

@Mohammad - 您可以使用'MakeGenericType',查看更新。 – Lee

相關問題