gpt4 book ai didi

c# - Linq:Queryable.OrderBy() 使用表达式集合

转载 作者:太空狗 更新时间:2023-10-29 19:46:59 26 4
gpt4 key购买 nike

我想知道如何在列表中存储 orderby 表达式。这就是我想写的:

List<Expression<Func<Products,Object>>> list = new List<Expression<Func<Products,Object>>>()
{
p => p.Name,
p => p.Id
};

然后:

var expr = list[0];
myProducts.OrderBy( expr );

适用于 p.Name,但不适用于 p.Id (list[1]),因为它会丢弃以下异常

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll Additional information: Unable to cast the type 'System.Int32' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.

我必须使用什么类型的列表?

最佳答案

这是我的解决方案(使用反射并基于 DynamicLinq 想法):

定义一个 ConvertableExpression 类,这样我们就可以拦截对自定义 OrderBy() 的调用:

public class ConvertableExpression<T>
{
public ConvertableExpression(Expression<Func<T, object>> expr)
{
this.Expression = expr;
}

public Expression<Func<T, object>> Expression { get; private set; }
}

引入一种扩展方法,以便更轻松地从普通 Expression 进行转换:

public static class ExpressionExtensions
{
public static ConvertableExpression<T> AsConvertable<T>(this Expression<Func<T, object>> expr)
{
return new ConvertableExpression<T>(expr);
}
}

使用 OrderBy() 的基于反射的实现扩展 IQueryable:

public static class QueryableExtensions
{
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, ConvertableExpression<T> expr)
{
Expression queryExpr = source.Expression;

var exprBody = SkipConverts(expr.Expression.Body);
var lambda = Expression.Lambda(exprBody, expr.Expression.Parameters);
var quote = Expression.Quote(lambda);

queryExpr = Expression.Call(typeof(Queryable), "OrderBy", new[] { source.ElementType, exprBody.Type }, queryExpr, quote);

return (IOrderedQueryable<T>)source.Provider.CreateQuery(queryExpr);
}

private static Expression SkipConverts(Expression expression)
{
Expression result = expression;

while (result.NodeType == ExpressionType.Convert || result.NodeType == ExpressionType.ConvertChecked)
result = ((UnaryExpression)result).Operand;

return result;
}
}

用法:

myProducts.OrderBy(expr.AsConvertable());

关于c# - Linq:Queryable.OrderBy() 使用表达式集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24504078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com