2014-09-09 4 views
0

Я думаю о разработке механизма бизнес-правил, который в основном генерирует EF-запрос из набора значений строк, хранящихся в базе данных.Dynamic EF Query

См., Например, Я буду хранить строку подключения, имя таблицы, предикат условия и выбрать предикат как строковые поля в db и хотел бы построить запрос EF динамически. Напр.

var db = new DbContext(“connectionstring”); 

var wherePredicate = Expression.FromString(“p => p.StartDate > new DateTime(2014,5,1)) 
var selectPredicate = Expression.FromString(“p => p”) 

var results = db.Set(“Projects”).Where(wherepredicate).Select(selectPredicate) 

Для построения предикатов я могу использовать DynamicExpression или Dynamic LINQ library.

Как я могу получить доступ к db.Set («Projects»), где Projects - это имя объекта, и применять предикаты where и select? (или что-то вроде db[“Projects”].Where().Select).

Я пробовал не общую версию метода DbContext.Set(Type entityttype), но не смог выяснить, как применять Where и Select предикаты к возвращенному объекту.

Я пытаюсь избежать генерации SQL-запросов и вместо этого полагаться на динамически генерируемый EF-код.

+0

Похоже, вы потеряете все преимущества сущности-рамки. – Aducci

ответ

0

Это не имеет большого смысла. Вы можете создать метод, который будет работать на string вместо общего типа с использованием отражения, но вам нужно будет вернуть DbSet не DBSet<T>. И на этом вы не можете выполнять методы LINQ (в основном), потому что нет типа (во время компиляции). Конечно, вы можете все это сделать, используя рефлексию, но тогда, почему ??? Вы теряете 90% от того, что O/R mapper делает для вас.