在LINQ里面为了设置键by子句动态(Set key inside order by clause

2019-09-22 22:02发布

我需要使用LINQ,其中关键是一个对象的属性来设置排序依据子句中的关键。 我只有用我的属性名称。 如何动态设置的属性。

class Obj 
{
    string Level
    {
       get;
       set;
    }
}

List<Obj> objList;

objList.OrderByDescending(x => x.Level); => "here i only have property name."

希望任何一个可以帮助

感谢苏尼尔

Answer 1:

你可以做到这一点扩展方法创建表达式树动态像

public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> enumerable, string sortColumn)
{
    var param = Expression.Parameter(typeof(T), "x");
    var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
    return enumerable.OrderByDescending(mySortExpression);;
 }

并为排序依据

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn)
{
    var param = Expression.Parameter(typeof(T), "x");
    var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
    return enumerable.OrderBy(mySortExpression);;
 }

你可以在一个像结合这两种

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn, string direction)
{
     var param = Expression.Parameter(typeof(T), "x");
     var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);

      IOrderedQueryable<T> iQuery;
      switch(direction)
      {
          case "desc": 
            iQuery = enumerable.OrderByDescending(mySortExpression);
            break;
          case "asc":
          default :
            iQuery = enumerable.OrderBy(mySortExpression);
            break;
      }
      return iQuery;
 }

然后,你可以这样调用它objList.OrderBy("Level","asc") //对于升序objList.OrderBy("Level","desc") //对于降序

希望这将有助于



文章来源: Set key inside order by clause in linq dynamically