gpt4 book ai didi

c# - 创建返回排序 lambda 表达式的通用方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:58 24 4
gpt4 key购买 nike

我创建了一个返回 lambda 语句的方法,以便在 OrderByOrderByDescending linq 方法中使用。

我想使用排序表达式的行是这样的:

var results = _dbSet.AsNoTracking()
.OrderByDescending(sort)
.ToList();
return results;

我想使用这种方法设置“排序”参数:

public static Expression<Func<TEntity, object>> GetSortExpression<TEntity>(string propertyName)
{
var item = Expression.Parameter(typeof(TEntity), "entity");
var prop = Expression.Property(item, propertyName);
var selector = Expression.Lambda<Func<TEntity, object>>(prop, item);

return selector;
}

但它会为“Product.Price”之类的“double”属性抛出错误

System.ArgumentException: 'Expression of type 'System.Double' cannot be used for return type 'System.Object'

我找不到问题出在哪里.....

最佳答案

您可以添加对 Convert 的调用以处理任何类型(必要时装箱)。这不一定像了解类型一样有效...

public static Expression<Func<TEntity, object>> GetSortExpression<TEntity>(string propertyName)
{
var item = Expression.Parameter(typeof(TEntity), "entity");
var prop = Expression.Convert(Expression.Property(item, propertyName), typeof(object));
var selector = Expression.Lambda<Func<TEntity, object>>(prop, item);

return selector;
}

使用 LINQPad,您可以创建一个示例 Expression 变量,然后 Dump() 其内容以查看编译器如何处理某些情况。

例如,通过使用

Expression<Func<double, object>> f = p => p;
f.Dump();

您将看到编译器将 UnaryExpression Convert 插入正文以将 double 转换为 object

关于c# - 创建返回排序 lambda 表达式的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47955489/

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