2014-12-03 25 views
0

我想創建一個查詢生成器生成的報表查詢動態動態查詢建設者的EntityFramework

假設我們在DB這樣的存儲任務

enter image description here

我寫這個方法我的倉庫

public IQueryable<T> fnExecute<T>(params Expression<Func<T, bool>>[] perdicates) where T : class 
    { 
     try 
     { 
      IQueryable<T> queryable = Context.Set<T>(); 
      foreach (var clause in perdicates) 
      { 
       queryable = queryable.Where(clause); 
      } 

      return queryable; 
     } 
     catch (Exception exp) 
     { 
      fnLogExceptions(exp); 
     } 
     return null; 

    } 

以及代碼ü可以很容易地使用這樣的

 var result = fnExecute<DB.TestTable>(
      s=>s.Id < 113, 
      s=>s.LastName.Contains("txtFoo") 
      ); 

和我想做的事情是:在每一個任務我在DB 閱讀實體名稱和它的運營商^ _創建謂詞^

現在的問題是:

反正是有我可以通過在運行時動態設置T類型並通過實體屬性名稱動態生成謂詞表達式來調用我的方法。

在此先感謝

回答

0

您可以使用反射+表達式方法。例如:

Type t = typeof(DB.TestTable); 
var s = Expression.Parameter(t, "s"); 
var l1 = Expression.Lambda(
    typeof(Func<,>).MakeGenericType(t, typeof(bool)), 
    Expression.LessThan(
     Expression.PropertyOrField(s, "Id"), 
     Expression.Constant(113) 
    ), 
    s 
); 

var query = repo.GetType() 
    .GetMethod("fnExecute") 
    .MakeGenericMethod(t).Invoke(repo, new object[] {l1}); 

它應該給你相當於:

var query = fnExecute<DB.TestTable>(s=>s.Id < 113);