正在创建表达式<;Func<;IQueryable<;T>;,IOrderedQueryable<;

本文关键字:lt gt IOrderedQueryable IQueryable Func 表达式 创建 | 更新日期: 2024-10-19 11:02:41

我想创建一个Expression<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)的东西

你能指导我怎么做吗?

正在创建表达式<;Func<;IQueryable<;T>;,IOrderedQueryable<;

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

其中,Tselector表达式中具有RegistrationDate属性的类型。

您可以使用MakeGenericType:从参数类型中获取可查询类型

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