C# 如何动态排序结果

C# 如何动态排序结果,c#,.net,entity-framework,iqueryable,C#,.net,Entity Framework,Iqueryable,我正在尝试动态应用排序。我正在使用EntityFramework。我正在通过sortorder和sortfield。现在我不想通过sortfieldcolumn为结果排序编写条件。我试过的如下: public static IOrderedQueryable<TSource> OrderByProperty<TSource, TKey>(this IQueryable<TSource> source, string property, string s

我正在尝试动态应用排序。我正在使用
EntityFramework
。我正在通过
sortorder
sortfield
。现在我不想通过
sortfield
column为结果排序编写条件。我试过的如下:

    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);
公共静态IOrderedQueryable OrderByProperty(此IQueryable源、字符串属性、字符串排序器)
{
ParameterExpression param=表达式参数(typeof(TSource),“t”);
MemberExpression成员=Expression.Property(参数,属性);
var ex=表达式.Lambda(成员,参数);
返回source.OrderBy(ex);
}
我叫它如下

    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);
OrderByProperty(objClass、sortfield、sortorder);
sortfield
类型为
System.Int32
时,我遇到以下错误:

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


字符串
相同。感谢您的帮助。

尝试以下扩展方法:

  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);
   }
公共静态IQueryable OrderByField(此IQueryable q,字符串SortField,bool升序)
{
var param=表达式参数(类型(T),“p”);
var prop=Expression.Property(param,SortField);
var exp=表达式Lambda(prop,param);
string方法=升序?“OrderBy”:“OrderByDescending”;
类型[]类型=新类型[]{q.ElementType,exp.Body.Type};
var mce=Expression.Call(typeof(Queryable)、方法、类型、q.Expression、exp);
返回q.Provider.CreateQuery(mce);
}

在Expression.Lambda中使用之前,可能需要先将
成员
添加到
TKey
。比如:
Expression.Lambda(Expression.Convert(member,typeof(TKey)),param)
要传入的属性的名称(
string属性
)必须与方法调用中的第二个类型参数(
TKey
)的类型相同。这就是错误告诉你的。