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