使用通用存储库设计模式编译的Linq

时间:2011-03-16 10:00:32

标签: linq generics entity-framework-4 linq-to-entities repository-pattern

我一直在寻找网络,但我还没有找到任何相关信息。正如我们所知,Linq为我们提供了CompiledQuery,它在运行之前将表达式转换为T-SQL。我正在尝试设计一个通用的存储库来与我的EF交互,但除了Linq查询被编译之外。如果有人能够对此有所了解那就太棒了:))

2 个答案:

答案 0 :(得分:2)

这几乎是不可能的,因为如果你想预编译查询,你必须知道它。使用通用存储库,您通常只有这个:

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

因此,使用存储库实例的代码负责定义查询。预编译需要具体的存储库,其中包含以下方法:

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

显然,你很难在通用存储库中准备这样的查询,因为它们依赖于具体的实体。

答案 1 :(得分:2)

您正在寻找 Specification pattern 的实施方式。基本上,这是创建一个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;
} 

关于使用实体框架实现规范模式的非常有用的文章可以在http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/找到