【问题标题】:How to order result dynamically如何动态排序结果
【发布时间】:2020-01-15 08:09:02
【问题描述】:

我正在尝试动态应用排序。我正在使用EntityFramework。我正在传递sortordersortfield。现在我不想写条件来按sortfield 列排序结果。我尝试过的如下,

    public static IOrderedQueryable<TSource> OrderByProperty<TSource, TKey>(this IQueryable<TSource> source, string property, string sortorder)
    {
        ParameterExpression param = Expression.Parameter(typeof(TSource), "t");
        MemberExpression member = Expression.Property(param, property);
        var ex = Expression.Lambda<Func<TSource, TKey>>(member, param);
        return source.OrderBy<TSource, TKey>(ex);
    }

我叫它如下,

OrderByProperty<Class, dynamic>(objClass, sortfield, sortorder);

sortfield 的类型为System.Int32 时,我遇到了错误;

“System.Int32”类型的表达式不能用于返回类型“System.Object”

string 相同。任何帮助表示赞赏。

【问题讨论】:

  • 可能需要先Convert memberTKey,然后才能在 Expression.Lambda 中使用它。喜欢:Expression.Lambda&lt;Func&lt;TSource, TKey&gt;&gt;(Expression.Convert(member, typeof(TKey)), param);
  • 您传入的属性名称(string property)需要与方法调用中的第二个类型参数(TKey)的类型相同。这就是错误告诉你的内容。

标签: c# .net entity-framework iqueryable


【解决方案1】:

试试这个扩展方法:

  public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending)
  {
        var param = Expression.Parameter(typeof(T), "p");
        var prop = Expression.Property(param, SortField);
        var exp = Expression.Lambda(prop, param);
        string method = Ascending ? "OrderBy" : "OrderByDescending";
        Type[] types = new Type[] { q.ElementType, exp.Body.Type };
        var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
        return q.Provider.CreateQuery<T>(mce);
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多