Скомпилированный Linq с универсальным шаблоном дизайна репозитория - PullRequest
1 голос
/ 16 марта 2011

Я искал в Интернете, но я еще не нашел никакой информации по этому вопросу.Как мы знаем, Linq предоставляет нам CompiledQuery, который перед запуском преобразует выражение в T-SQL.Я пытаюсь создать общий репозиторий для взаимодействия с моим EF, но за исключением того, что запросы Linq компилируются.Если бы кто-нибудь мог пролить свет на это, было бы здорово :) 1001 *

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Вы ищете реализацию шаблона спецификации .По сути, это создание объекта Specification, который содержит информацию, необходимую для фильтрации вашего запроса.Используя Спецификации, вы можете иметь реализацию Generic Repository и поместить свою собственную логику запроса в спецификацию.Базовый класс спецификации выглядит примерно так:

public class Specification<TEntity>
{
   public Specification(Expression<Func<TEntity, bool>> predicate)
   {
       _predicate = predicate;
   }

   public bool IsSatisfiedBy(TEntity entity)
   {
       return _predicate.Compile().Invoke(entity);
   }

   public Expression<Func<TEntity,bool>> PredicateExpression{
       get{ return _predicate; }
   }      

   private Expression<Func<TEntity, bool>> _predicate;
} 

Очень полезную статью о реализации шаблона спецификации с помощью Entity Framework можно найти по адресу http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/

2 голосов
/ 16 марта 2011

Это вряд ли возможно, потому что если вы хотите предварительно скомпилировать запрос, вы должны это знать. С универсальным репозиторием у вас обычно есть только это:

public interface IRepository<T>
{
  IQueryable<T> GetQuery();
}

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

IEnumerable<Order> GetOrdersWithHeaderAndItemsByDate(DateTime date, int take, int skip);
IEnumerable<OrderHeader> GetOrderHeadersOrderedByCustomer(int take, int skip);

и т.д.

Очевидно, что вы вряд ли сможете подготовить такие запросы в общем хранилище, поскольку они зависят от конкретной сущности.

...