2017-12-19 4 views
0

は、私はそれでパス文字列パラメータにのOrderBy

string sortBy = "StatusID"; 
return dbContext.Requests.OrderByField(sortBy,true) 

しかし、どのように私は、ダイナミックでORDERBYできるが、それを使用

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string 
SortField, bool Ascending){ 
     var param = Expression.Parameter(typeof(T), "p"); 
     var prop = Expression.Property(param, SortField); 
     var exp = Expression.Lambda(prop, param); 
     string method = Ascending ? "OrderBy" : "OrderByDescending"; 
     Type[] types = new Type[] { q.ElementType, exp.Body.Type }; 
     var mce = Expression.Call(typeof(Queryable), method, types, 
     q.Expression, exp); 
     return q.Provider.CreateQuery<T>(mce); 
    } 

を拡張子をorderByFieldていますクエリテーブルに関連する列の文字列パラメータ

dbContext.Requests.OrderBy(x => x.Status.Description) 
+0

はトン思えます再帰反射についてのアルケン化 – Logerfo

答えて

1

の形で引数、あなたがなります

  • まず、すべてのプロパティ
  • 反復は、プロパティ名と建物のプロパティアクセサ式
  • 上で使用し、ラムダ式の本体としての表現を構築し得るために、引数を分割する必要があり
  • 例えば

:私たちがしているよう

public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending) 
{ 
    var param = Expression.Parameter(typeof(T), "p"); 
    Expression expBody = param; 
    string[] props = SortField.Split('.'); 
    foreach (var prop in props) 
    { 
     expBody = Expression.Property(expBody, prop); 
    } 
    var exp = Expression.Lambda(expBody, param); 
    string method = Ascending ? "OrderBy" : "OrderByDescending"; 
    Type[] types = new Type[] { q.ElementType, exp.Body.Type }; 
    var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp); 
    return q.Provider.CreateQuery<T>(mce); 
} 
+0

ありがとう!それは私と一緒に働く –