【问题标题】:Join multiple table using generic repository patten with Entity framework with unit of work使用具有工作单元的实体框架使用通用存储库模式连接多个表
【发布时间】:2014-03-12 07:04:57
【问题描述】:

我正在使用带有实体框架 5 的 MVC4 开发一个 Web 应用程序。

我创建了通用存储库,用于使用工作单元访问数据库。

拥有以下两个仓库,

  • CustomerRepository - 客户表
  • LibraryRepository - 库表

这两个表没有相互链接(没有外键关系)。

想通过组合这些存储库来编写查询。是否可以通过组合两个不同的存储库来编写查询?

如果是,请告诉我路。

【问题讨论】:

    标签: entity-framework generics repository unit-of-work


    【解决方案1】:

    如果您的通用存储库公开了 IQueryable 方法,您应该能够使用 LINQ 连接来查询两个存储库:

    var items = from c in customerRepository.AsQueryable()
                join l in libraryRepository.AsQueryable() on c.SomeProperty equals l.SomeOtherProperty
                select new { CustomerName = c.FirstName, LibraryName = l.Name };
    

    查询的功能可能会受到限制,但我在自己的代码库上在两个独立的存储库之间做了一个快速的概念验证,它工作得很好(预期的 sql 触发)。

    更新

    您似乎正在尝试使用 where 子句进行两个单独的查询——我不相信 LINQ2Entities 支持您正在尝试做的事情。尝试将您的代码更新为以下内容:

    var customer = (
        from cus in _customer.Query()
        join lib in _library.Query()
        on cus.LId equals lib.Id select cus
    ).ToList();
    

    您要将两个“from/where”查询替换为“join/on”。

    【讨论】:

    • 请找到我的代码。 var customer = (from cus in _customer.Query() from lib in _library.Query() where cus.LId == lib.Id select cus ).ToList();没有编译时错误。运行代码时出现以下异常。你能告诉我我做错了什么吗? LINQ to Entities 无法识别方法 'System.Linq.IQueryable`1[Customer] Query()' 方法,并且此方法无法转换为存储表达式。
    • 变量_customer和_library是什么类型?该错误似乎表明它们已经是 IQueryable。如果发生这种情况,请尝试从该语句中删除 .Query() 方法调用,然后重试。
    • _customer,_library 是客户和库表的存储库。 Query() 方法返回 DBSet 对象。请在下面找到通用存储库代码 public IDbSet ProductDbSet { get { return _dbSet ?? (_dbSet = BaseDbContext.Set());} } public IQueryable Query() { IQueryable query = ProductDbSet;返回查询; }
    • 将查询更改为使用“加入”后,代码工作正常。你能告诉我更多关于使用“where”查询时的问题吗?
    • 很高兴它为您工作(很高兴接受它作为答案,因为它解决了您的问题)。为了使这两个 where's 正常工作,查询需要访问底层 DbSet 本身,而不是 IQueryable。使用通用的存储库接口,这往往会违反规定。我总是使用 join 方法,所以也许其他人可以解释原因?
    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多