Использование предварительно скомпилированных запросов linq с шаблоном репозитория в EF - PullRequest
1 голос
/ 25 января 2012

Можно ли использовать предварительно скомпилированные запросы linq с репозиториями. В настоящее время мои хранилища настроены как

public class CustomerRepository : EntityRepository
{
    private readonly IContext _context;
    public CustomerRepository(UnitOfWork uow)
        {
            _context = uow.context;
        }
}

Я мог бы создать предварительно скомпилированный запрос следующим образом, используя мой фактический класс контекста MyEntities: ObjectContext, IContext.

static Func<ObjectContext, int, Customer> _custByID;

public static Customer GetCustomer( int ID)
{
  if (_custByID == null)
  {
    _custByID = CompiledQuery.Compile<MyEntities, int, Customer>
     ((ctx, id) => ctx.Customers.Where(c => c.CustomerID == id).Single());
  }
  return _custByID.Invoke(_context, ID);
}

Проблема в том, что методы компиляции TArg0 принимают тип, производный от ObjectContext. Поскольку вся моя цель использования репозиториев с IContext состояла в том, чтобы скрыть связанный с объектной структурой код, используя вышеприведенное, не имеет смысла. Как мне использовать предварительно скомпилированные запросы linq. Должен ли я переместить их в отдельную библиотеку классов, которая ссылается на мою модель и структуру сущностей, или мое представление о репозиториях неверно? Я использую EF4 в приложении ASP.net.

1 Ответ

3 голосов
/ 25 января 2012

Реализация репозитория должна обладать знаниями технологии доступа к данным.Ответственность хранилища заключается в том, чтобы поговорить с основным источником данных, чтобы выполнить контракт.Было бы бесполезно иметь хранилище, если вы не можете выполнять такие оптимизации, потому что ObjectSet уже является хранилищем.Создание еще одного слоя косвенности между хранилищем и EF - бесполезная абстракция.

...