0

这里提供了pht中ORM中select n+1问题的简单例子,但是思路在其他语言的其他ORM中应该是一样的。

一个典型的解决方案是使用 eager loading 将其减少到 1 个查询,我认为这不是很难,但是,OTOH,它非常脆弱,因为后面的重构需要开发人员更改两个地方,否则这个 select n + 1个问题再次出现。

我的直觉是应该可以进行一些路径分析来确定这些子属性将在代码的后面部分使用,所以让我们生成查询以一次性收集所有必要的信息。

对于使用解释语言(如 ruby​​、php 等)实现的 ORM,这可能要求太多了。但是,无论是 Java(NHibernate)还是 C#(实体框架)都没有进行这种路径分析,AFAIK。为什么是这样?

4

1 回答 1

0

我不明白,如果你使用 EntityFramework,你可以使用 Include(....) 来指定在同一个查询中加载哪些延迟加载的子关系实体,如果你指定一个考虑到某个字段的子句包含实体,您会收到一个请求(简而言之,只需在您的 linq 查询中使用连接)

顺便说一句,您可以在这里找到一个古老且相关的问题,例如:什么是 SELECT N+1?

正如我在下面评论的那样,一种方法可能是让您调用一个方法来添加所有需要的包含,这样当您添加一个新的可导航属性/集合时,您只需要记住在那里添加,这个答案向您展示了这个概念:https://stackoverflow.com/a/14520939/1716620

于 2015-12-07T22:54:24.917 回答