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.Property或Field(param,columnName);

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

因为或derBy的类型不是从sortExpression推断出来的,所以我需要在运行时指定如下内容:

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

return query.或derBy<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);
}

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

Edit:对于降序,请输入OrderByDescending而不是"OrderBy":

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

.net相关问答推荐

StackExchange.Redis和NRedisStack包有什么不同?

dotnet 8 web api在部署到docker后无法工作

无法对.NET MAUI类库进行单元测试

如何将 Assembly.CodeBase 转换为 C# 中的文件系统路径?

DbContext 丢弃更改而不释放

如何创建 LINQ to SQL 事务?

如何在没有抽象基类的情况下强制覆盖后代中的方法?

将客户端证书添加到 .NET Core HttpClient

支持 HTTPS 的 Httplistener

在安全处理异常时避免首次机会异常消息

公钥令牌的作用是什么?

返回 IList 是否比返回 T[] 或 List 更糟糕?

如何禁用 Alt + F4 关闭表单?

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

.NET 的黄瓜替代品

ReaderWriterLockSlim 什么时候比简单的锁更好?

错误 NU1605 检测到包降级

确定使用 ContextMenuStrip 的控件

如何从 webclient 获取状态码?

您可以将 Microsoft Entity Framework 与 Oracle 一起使用吗?