Вместо того, чтобы возвращать IQueryable<T>
, позвольте вашему репозиторию реализовать IQueryable<T>
и вместо того, чтобы помещать DataContext
в репозиторий, оберните и DataContext
, и репозитории в единицу работы. Ваш репозиторий может выглядеть так:
public abstract class Repository<T> : IQueryable<T>
where T : class
{
private readonly IQueryable<T> query;
protected Repository(IQueryable<T> query)
{
this.query = query;
}
public Type ElementType
{
get { return this.query.ElementType; }
}
public Expression Expression
{
get { return this.query.Expression; }
}
public IQueryProvider Provider
{
get { return this.query.Provider; }
}
public abstract void InsertOnSubmit(T entity);
public abstract void DeleteOnSubmit(T entity);
...
}
Я использую этот подход, чтобы эффективно скрывать мой O / RM за абстракцией, что позволяет мне проводить модульное тестирование моего приложения, в то же время позволяя использовать LINQ для моих репозиториев и имеют шаблон единицы работы.
Вы можете прочитать все об этом здесь: Подделка вашего провайдера LINQ .