【发布时间】:2023-03-03 11:48:01
【问题描述】:
下面的代码很好用,我想动态构建一个orderby:
public static IQueryable<TEntity> OrderByAnyField<TEntity>(this IQueryable<TEntity> source, string orderByProperty, bool desc, Type propertyType)
{
string command = desc ? "OrderByDescending" : "OrderBy";
var type = typeof(TEntity);
var property = type.GetProperty(orderByProperty);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExpression = Expression.Lambda(propertyAccess, parameter);
var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType },
source.Expression, Expression.Quote(orderByExpression));
return source.Provider.CreateQuery<TEntity>(resultExpression);
}
所以,我希望能够更改排序的 CAST。所以,作为一个例子,我想采取:
.OrderBy(x => x.Something)
改为这样做:
.OrderBy(x => double.Parse(x.Something))
非常感谢任何帮助
【问题讨论】:
-
当 linq 已经为您提供了对任何属性进行排序的功能时,那么要在这里实现什么?
-
我需要按传递的列名动态排序。我还需要“投”专栏。因此,我使用上面的代码按传递的列名进行排序。 (即 .OrderByAnyField(passedColumnName, false, typeof(double)) )。 passColumnName 可以是源中任何列的名称。
-
为了清楚起见,让我添加到我的评论中。我可以按列排序,与 .OrderBy(x => x.Something) 相同。我想通过转换为不同的数据类型进行排序,例如 .OrderBy(x => double.Parse(x.Something))。如果我尝试使用不同的数据类型,在 resultExpression 中,我会收到一个错误:
标签: linq dynamic expression