2013-09-21 56 views
0

树lambda表达式我有一个方法,通过一个ObjectDataSource馈送GridView和允许使用lambda表达式由列排序:建设泛型列表

public IList<UsersEntity> GetUsers() 
    { 
     return new List<UsersEntity>(new[] { 
      new UsersEntity{ UsrId =1, UsrName="Luis" }, 
      new UsersEntity{ UsrId = 2, UsrName = "Pablo"} }); 
    } 

    public IList<UsersEntity> GetUsers(string OrderBy) 
    { 
     string[] ordParts = OrderBy.Split(' '); 
     string ordBy = ordParts[0]; 
     string direction = "ASC"; 
     if (2 == ordParts.Length) 
      direction = "DESC"; 

     //Get Unsorted List 
     List<UsersEntity> Lista = (List<UsersEntity>)GetUsers(); 

     //Function to order 
     Func<UsersEntity, object> myFunct = null; 
     myFunct = (usr) => { 
      if ("UsrId" == ordBy) return usr.UsrId; 
      else return usr.UsrName; 
     }; 

     //sort list 
     if ("ASC" == direction) 
      return Lista.OrderBy(myFunct).ToList(); 
     else 
      return Lista.OrderByDescending(myFunct).ToList(); 

    } 

但我想要的东西更实用的东西,对于所有类型的作品列表并且不涉及添加大量代码。所以我写了这个功能,我无法完成:

public class OrdenarEntidades<T> 
{ 
    public static IEnumerable<T> SortList(IEnumerable<T> Listado, string OrderByArg) 
    { 
     string[] arrOrderBy = OrderByArg.Split(' '); 
     string orderBy = arrOrderBy[0]; 
     string direction = "ASC"; 
     if (2 == arrOrderBy.Length) 
      direction = "DESC"; 

     foreach (PropertyInfo pInfo in typeof(T).GetProperties()) 
     { 
      if (orderBy == pInfo.Name) 
      { 
       Type tipDev = pInfo.PropertyType; 
       Func<T, tipDev> MyFunct = (Entity) => { pInfo.GetValue(Entity, null); }; 

       if ("ASC" == direction) 
        Listado.OrderBy(MyFunct); 
       else 
        Listado.OrderBy(MyFunct); 
      } 
     } 

     return Listado; 
    } 
} 

我知道这个代码不编译,但表达了我想要完成的想法。

Marc Gravell给出了一个近似什么我正在寻找(here),但不知道怎样使它适应我的代码

在此之前,非常感谢你。

+0

http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet –

+0

多想想你的问题......是什么上下文你要使用的功能?似乎只是包装linq功能很麻烦。 OrderBy字符串是否存储在数据库中? –

回答

0

你需要像

public class OrdenarEntidades<T> 
{ 
    public static IOrderedEnumerable<T> SortList(IEnumerable<T> Listado, params Func<T, object>[] orders) 
    { 
     if(orders.Length == 0) 
      return Listado; 
     IOrderedEnumerable<T> result = Listado.OrderBy(orders[0]); 
     for(int i = 1; i < orders.Length; ++i) 
      result = result.ThenBy(orders[i]); 
     return result; 
    } 
} 

这仅支持升序排列。要允许这两个方向在包含Func<T, object>的类中使用基于其调用OrderByOrderByDescending的方向属性。

该函数可以这样调用

var usersSorted = OrdenarEntidades<UserEntity>.SortList(users, user=>user.UsrId, user=>user.UsrName); 
+0

这没有任何意义。调用'OrderBy()'多次实际上只排序一次,最后一次使用排序。 – svick

+0

当然,没有任何意义。用ThenBy替换后续的'OrderBy'来解决这个问题。 –