在LINQ的秩序将重点by子句动态 [英] Set key inside order by clause in linq dynamically

查看:125
本文介绍了在LINQ的秩序将重点by子句动态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要设置使用LINQ的排序依据条款,其中关键是一个对象的属性的关键。我只有用我的属性名称。我怎么能动态设置属性。

I need to set the key in the OrderBy clause using linq , where the key is a property of an object. I only have the property name with me. How can i set the property dynamically.

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

List<Obj> objList;

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



希望任何一个可以帮助

Hope any one can help

谢谢
苏尼尔

推荐答案

您可以通过扩展方法 创建表达式树 动态像

You can do this by Extension Methods and Creating Expression Trees dynamically like

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);;
 }

和您可以在一个结合这两种像

and you can combine these two in one like

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( 级别,ASC) //对于升序
objList.OrderBy(级别,降序) //对于降序

Then you can call it like objList.OrderBy("Level","asc") //For Ascending objList.OrderBy("Level","desc") //For Descending

希望这将有助于

这篇关于在LINQ的秩序将重点by子句动态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆