This提供了一个简单的例子,在pht的ORM中选择n + 1问题,但这个想法应该与其他语言的其他ORM相同。
一个典型的解决方案是使用急切加载将其减少为1个查询,我认为这很难,但是,OTOH,它非常脆弱,因为后面的重构需要开发人员改变两个地方,否则重新发生这个选择n + 1问题。
我的直觉是应该可以做一些路径分析来弄清楚那些子属性将在代码的后面部分使用,所以让我们生成查询以收集所有必要的信息一个人去。
要求使用解释语言(如ruby,php等)实现ORM可能要太多了。但是,Java(NHibernate)和C#(实体框架)都没有进行此路径分析,AFAIK。这是为什么?
答案 0 :(得分:0)
我不明白,如果您使用EntityFramework,您可以使用Include(....)来指定在同一查询中加载哪些可延迟加载的子关系实体,并且如果您指定一个考虑到某些子句的子句在那个包含的实体上的字段,你得到一个请求(简言之,只需在你的linq查询中使用连接)
顺便说一下,您可以找到一个旧的相关问题:What is SELECT N+1?
正如我在下面评论的那样,一种方法可能是让你调用一个方法来添加你需要的所有包含,这样当你添加一个新的可导航属性/集合时,你只需要记住添加它,这个答案会告诉你概念:https://stackoverflow.com/a/14520939/1716620