Не уверен на 100%, что вы спрашиваете - насколько я понимаю, вы не можете динамически создать набор сущностей на основе T.
Ну, это достаточно просто:
public class DataRepository<T> : IRepository<T> where T : class
{
private ObjectContext _ctx;
public DataRepository<T>(ObjectContext ctx)
{
this._ctx = ctx;
}
public IObjectSet<T> CurrentEntitySet<T>()
{
get
{
var entityName = _plularizer.Pluralize(typeof(T).Name);
string entitySetName = string.Format("{0}.{1}", EntityContainerName, entityName);
return _ctx.CreateObjectSet<T>(entitySetName );
}
}
}
Тогда ваш определенный репозиторий может сделать это (например):
public class AppleRepository : DataRepository<Apple>
{
public AppleRepository(IObjectContext ctx) : base(ctx) {}
public ICollection<Apple> FindApples(Func<Apple,bool> predicate)
{
return CurrentEntitySet.Where(predicate).ToList();
}
}
И когда вы создаете свой репозиторий, проходите через контекст объекта - предпочтительно через DI:
var repository = new AppleRepository(new ExpressionEntities()); // should be DI'ed
По сути, мы используем Pluralization (тот же код, который используется Entity Framework для множественного числа имен наборов сущностей) и CreateObjectSet<T>
.
Таким образом, если вы создали DataRepository<Apple>
, это переведет имя набора сущностей Яблоки (которое должно соответствовать набору сущностей вашей модели), и мы создадим основанный на этом объект.
Свойство EntityContainerName находится на вашем EDMX - вы должны передать его через ctor (желательно через DI).
Это отвечает на ваш вопрос?