【问题标题】:Split query with includes into multiple queries将包含包含的查询拆分为多个查询
【发布时间】:2013-07-10 22:22:44
【问题描述】:

我使用的是 EF5 Code First 并且有这样的查询:

        var query = DbSet.Include(ent => ent.Websites)
            .Include(ent => ent.Addresses)
            .Include(ent => ent.IndustryType)
            .Include(ent => ent.Factors)
            .Include(ent => ent.Factors.Select(fact => fact.Objectives))
            .Include(ent => ent.DmpNodes)
            .Include(ent => ent.DmpNodes.Select(node => node.DmpNodeConnections));

如果我使用超过 4 个包含,则查询执行速度很慢。我已经知道这是为什么了。

我可以省略例如DmpNodes 包含并使用延迟加载加载该导航属性,但这将导致数百个查询。

我正在寻找一种方法来拆分此查询,以便我可以首先加载实体,例如地址、行业类型和因素。然后用第二个查询填充这些实体。

这是可能的还是有其他好的解决方案?

【问题讨论】:

  • 如果您使用相同上下文执行单独的请求,EF 将自动加入内存中的相关实体。
  • 你能告诉我这在代码中是什么样子的吗?最后,我需要填充所有导航属性的实体对象。
  • 好吧,在你这边写一个测试。在使用相同上下文的单独查询中选择网站,然后选择地址,看看导航属性是否填写正确!
  • 有没有需要all包含的用例?我强烈希望有针对特定用例的查询。
  • @MaxS 我没有意识到它这么简单 :-) 就像一个魅力。

标签: entity-framework entity-framework-5


【解决方案1】:

如果您使用相同的上下文执行单独的 L2E 查询,EF 将自动连接内存中的相关实体。

只需在你身边写一个测试。在使用相同上下文和导航属性的单独查询中选择Websites,然后选择Addresses 将正确填写!

【讨论】:

  • 在请求之间共享上下文是个坏主意。使用它来获取相关实体是一个更糟糕的主意,因为它使代码依赖于执行历史。但是,您可以通过显式加载集合来在 一个 请求(和上下文)中使用关系修复功能。
  • 我完全同意Context 的生命周期应该尽可能短的事实。 requests 我不是指HTTPRequest,而是数据库请求(L2E 查询)。我已经编辑了我的答案。
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多