将预编译的linq查询与EF中的存储库模式一起使用

时间:2012-01-24 21:35:01

标签: linq entity-framework entity-framework-4 repository-pattern unit-of-work

是否可以将预编译的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查询。我应该将它们移动到一个单独的类库,它引用我的模型和实体框架,还是我对存储库的理解不正确?我在ASP.net应用程序中使用EF4。

1 个答案:

答案 0 :(得分:3)

存储库实现应该具备数据访问技术的知识。存储库的职责是与基础数据源通信以满足合同。如果您无法执行此类优化,那么拥有存储库将毫无用处,因为ObjectSet已经是存储库。在存储库和EF之间创建另一层间接是一种无用的抽象。