2014-03-27 93 views
1

爲什麼此方法不對列表中的值進行排序?OrderBy使用泛型的IEnumerable

public Paging(IEnumerable<T> values, int start, int limit, string property, string dir) 
     { 
      this.Total = values.Count(); 

      Func<T, string> func = a => a.GetType().GetProperty(property).Name; 

      IEnumerable<T> order = null; 

      if (dir == "DESC") 
       order = values.OrderByDescending(func); 
      else 
       order = values.OrderBy(func); 

      if ((start + limit) > this.Total)   
       limit = this.Total - start; 

      IEnumerable<T> items = (start < 0 || limit < 0) ? order : order.Skip(start).Take(limit); 

      this.AddRange(items); 
     }  

回答

1

您按屬性名稱,這是集合中的每個元素相同的排序。這個表達式總是會返回property

a => a.GetType().GetProperty(property).Name 

如果排序是整個集合常量表達式,它沒有任何效果。

無論如何,在排序中使用反射是一個非常糟糕的主意,因爲它會導致執行排序的極度開銷。我建議使用Dynamic LINQ,它具有內置的功能,可以按名稱給出屬性進行排序。

如果添加了動態LINQ庫到你的項目,你將能夠代替寫:

if (dir == "DESC") 
    order = values.OrderBy(property + " DESC"); 
else 
    order = values.OrderBy(property); 
+1

OrderByDescending不存在。使用order = values.OrderBy(property +「DESC」);或order = values.OrderBy(property); – Gus

+0

@格斯:很好!我修好了。 – mellamokb