Я бы сказал, создайте свой DAL, используя IQueryable, и передайте его, убедитесь, что ваш объект предполагает, что время жизни - это запрос.Таким образом, вы получите выгоду от отложенного выполнения, но подвержены риску неэффективных запросов к базе данных.
Затем убедитесь, что вы тестируете производительность своего приложения (или хотя бы частей, которые с наибольшей вероятностью получат трафик) иувидеть шаблоны доступа к данным.Создайте специализированные методы в вашем DAL для получения полностью материализованных объектов и сделайте эти запросы как предварительно скомпилированные запросы.
образец интерфейса репозитория будет выглядеть как
public interface IDataContext
{
void Add<T>(T entity) where T : BaseEntity;
void Delete<T>(T entity) where T : BaseEntity;
IQueryable<T> Find<T>(Expression<Func<T, bool>> where) where T : BaseEntity;
}
, где BaseEntity - базовый класспохоже, что для всех наших классов этот класс не сопоставлен ни с одной таблицей в db
public abstract class BaseEntity
{
public int Id { get; set; }
public DateTime CreateDateTime { get; set; }
public string CreateUser { get; set; }
public DateTime ModDateTime { get; set; }
public string ModUser { get; set; }
public byte[] RowVersion { get; set; }
}
Expression<Func<T, bool>>
будет передавать все выражение в ваш репозиторий вместо просто Func, поскольку EF работает с выражением длягенерировать sql-запрос, типичное использование будет
ICollection<WFGroup> wgGroups = this.dataContext.Find<WFGroup>((w) => true).ToList();
, где WFGroup - это класс, производный от BaseEntity, я обычно использую ленивую загрузку и прокси и не отсоединяю / присоединяю объекты к контексту.