gpt4 book ai didi

c# - 如何在通用扩展方法中使用字符串列名称在 IQueryable 上应用 OrderBy?

转载 作者:IT王子 更新时间:2023-10-29 03:38:34 26 4
gpt4 key购买 nike

public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
where T : EntityObject
{
var param = Expression.Parameter(typeof(T), "o");
var body = Expression.PropertyOrField(param,columnName);

var sortExpression = Expression.Lambda(body, param);
return query.OrderBy(sortExpression);
}

因为 OrderBy 的类型不是从 sortExpression 推断出来的,所以我需要在运行时像这样指定它:

var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);

或者

return query.OrderBy<T, TSortColumn>(sortExpression);

我认为这是不可能的,因为 TSortColumn 只能在运行时确定。

有解决办法吗?

最佳答案

我们在 LINQ to SQL 项目中做了类似的事情(不是 100% 相同,但相似)。这是代码:

public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
var type = typeof(T);
var property = type.GetProperty(ordering);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));
return source.Provider.CreateQuery<T>(resultExp);
}

我们实际上并没有使用泛型,我们有一个已知的类,但它应该可以在泛型上工作(我已经将泛型占位符放在它应该在的地方)。

编辑:对于降序,传入 OrderByDescending 而不是“OrderBy”:

MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExp));

关于c# - 如何在通用扩展方法中使用字符串列名称在 IQueryable 上应用 OrderBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/307512/

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