2014-12-03 2 views
0

я хочу создать конструктор запросов для создания запроса отчета динамическиDynamic Query Builder с EntityFramework

Предположим, что у нас есть что-то подобное в БД для хранения задач

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") 
      ); 

и то, что я хочу сделать, это: в каждой задаче я прочитал EntityName в БД и создать предикаты его операторами^_^

здесь проблема:

есть в любом случае что я могу вызывать свой метод, динамически устанавливая тип 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);