2013-08-01 2 views
1

Во-первых, я - noob для EF и LINQ и даже в меньшей степени, C# в целом. Извините, если мой вопрос плохо сформулирован или просто пронзен.Динамический LINQ to Entities, где EntityType является общим

Я искал все для примера этого, но безрезультатно. Я пытаюсь создать «ракурс поиска», который может принять любой тип сущности в моей модели и представит пользователю пользовательский интерфейс для выполнения пользовательских запросов.

В случае вопросов 10 или более 100 вопросов, связанных с «Динамическим LINQ» или «Динамическим запросом», кажется, что все они имеют общее, что тип объекта известен во время компиляции. Что делать, если мы НЕ знаем это во время компиляции? Смысл, структура просто примет любой тип сущности от разработчика, а затем построит запрос LINQ оттуда.

Что мне нужно сделать, так это иметь этот контекст. Клиенты должны быть предоставлены во время выполнения, а затем создавать «Where (s)», используя что-то вроде PredicateBuilder, скорее всего PredicateBuilder.

так что-то вроде:

var query = from c in context.Customers select c; 

будет больше похож:

var query = from c in AnyContext.AnyEntity select c; 

Я думаю, мой вопрос, какой объект можно использовать держать аргументы AnyContext и AnyEntity в моем скомпилированный код таким образом, чтобы они может быть заменен реальным контекстом и объектом во время выполнения?

Я внимательно рассмотрел примеры PredicateBuilder и System.Linq.Dynamic, но все они имеют EntityType, определенные во время разработки. Для меня это не динамический запрос, а просто динамический предикат.

+0

Существует ли конечный набор коллекций сущностей (таблиц), которые можно найти? –

ответ

0
var query = from c in AnyContext.AnyEntity select c; 

Это точно так же, как:

var query = AnyContext.AnyEntity; 

Другими словами, если тип контекста и множества сущностей свойство выбираются пользователем, вы можете просто начать с чем-то вроде этого:

var query = (IObjectSet<T>) GetObjectSetViaReflection(context, propertyName); 

Кроме того, я не уверен, что другие версии Entity Framework есть это, но на .NET 4.5, вы можете вызвать CreateObjectSet произвести запрос:

IObjectSet<T> query = context.CreateObjectSet<T>(); 
// or, if the context has multiple properties with the same type, 
// you can specify a name. 
IObjectSet<T> query = context.CreateObjectSet<T>(propertyName); 
+0

@Babbleon: Нет, я использовал '', потому что это стандартное имя для общего класса, а заголовок вопроса указывает, что тип объекта является общим. 'GetObjectSetViaReflection' - псевдокод. Существует множество учебных пособий по отключению объекта от объекта, поэтому я решил, что это выходит за рамки этого вопроса. – StriplingWarrior

+1

В EF у 'DbContext' есть способ получить общий набор, например:' Context.Set () '. – Ocelot20