在linq中动态设置内部order by子句的键

Sun*_*nil 2 c# linq reflection

我需要使用linq在OrderBy子句中设置键,其中键是对象的属性.我只有我的财产名称.如何动态设置属性.

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

List<Obj> objList;

objList.OrderByDescending(x => x.Level); => "here i only have property name."
Run Code Online (Sandbox Code Playgroud)

希望任何人都能提供帮助

谢谢Sunil

Yog*_*pta 5

您可以通过扩展方法和动态创建表达式树来完成此操作

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);;
 }
Run Code Online (Sandbox Code Playgroud)

而对于OrderBy

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);;
 }
Run Code Online (Sandbox Code Playgroud)

你可以将这两者合二为一

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;
 }
Run Code Online (Sandbox Code Playgroud)

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

希望它会有所帮助