2012-09-24 24 views
2

我需要使用linq設置OrderBy子句中的鍵,其中鍵是對象的一個​​屬性。我只有我的財產名稱。我如何動態設置屬性。動態地在linq中設置按鍵的順序

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

List<Obj> objList; 

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

希望任何人能幫助

感謝 蘇尼爾

+1

反思救援。當心它可能會很慢,但。 –

+0

是的,我看到了方法來獲取屬性名稱,類型但無法找到我需要的。可能bcoz我不熟悉反射。 – Sunil

回答

5

您可以通過Extension MethodsCreating Expression Trees動態

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") //降序

希望這將有助於

+0

..感謝您的幫助..但很傷心,我在.net 3.5中工作,而且它不工作。 – Sunil

+0

@Sunil,前兩個將在.net 3.5上運行。 –

+0

@Sunil,更新了答案,所有方法都適用於.net 3.5 –