我有一个函数用来动态地执行OrderBy()
:
internal static Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> GetOrderBy(List<(string, bool)> orderColumnsAndIsDesc)
{
bool IsFirst = true;
MethodCallExpression resultExp = null;
string methodName;
LambdaExpression finalLambda = null;
foreach (var item in orderColumnsAndIsDesc)
{
string prop = item.Item1;
string orderType = item.Item2 == true ? "asc" : "desc";
Type typeQueryable = typeof(IQueryable<TEntity>);
ParameterExpression argQueryable = Expression.Parameter(typeQueryable, "p");
var outerExpression = Expression.Lambda(argQueryable, argQueryable);
IQueryable<TEntity> query = new List<TEntity>().AsQueryable<TEntity>();
Type type = typeof(TEntity);
ParameterExpression arg = Expression.Parameter(type, "x");
Expression expr = arg;
PropertyInfo pi = type.GetProperty(prop, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
LambdaExpression lambda = Expression.Lambda(expr, arg);
if (IsFirst)
{
methodName = orderType == "asc" ? "OrderBy" : "OrderByDescending";
resultExp =
Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(TEntity), type }, outerExpression.Body, Expression.Quote(lambda));
}
else
{
methodName = orderType == "asc" ? "ThenBy" : "ThenByDescending";
resultExp =
Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(TEntity), type }, resultExp, Expression.Quote(lambda));
}
finalLambda = Expression.Lambda(resultExp, argQueryable);
IsFirst = false;
}
return (Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>>)finalLambda.Compile();
}
当有一个项目要排序时,它可以正常工作,但当有多个项目时,它会给出错误。其错误:
系统操作无效异常:从范围""引用了类型为"System.Linq.IQueryable'1 [CMS. Data. Models. Category]"的变量"p",但未定义该变量
我不知道怎么修,请帮帮我。
2条答案
按热度按时间rseugnpd1#
试试这个:
92vpleto2#
如果使用扩展方法ApplyOrderBy,则可以按以下方式编写函数: