今天我遇到了一些有点奇怪的事情。
我使用mini-profiler查看执行的SQL查询。
似乎在使用obj.Children.Select(x => x.Prop1).SingleOrDefault()时执行的查询获取所有列。 但是,使用ctx.Children.Select(x => x.Prop1&& x.IDParent == idObj).SingleOrDefault()只获取Prop1。
知道为什么会有差异吗?
答案 0 :(得分:2)
因为第一个查询在这里执行:
obj.Children. ...
第二个查询在这里得到了解释:
... .SingleOrDefault()
您获得包含所有列的完整实体的第一个查询,因为导航属性由于延迟加载而加载。加载实体后,您的Select
将应用于内存中。当您投影到单个属性时,此时数据库查询已完成。
第二个查询实际上在数据库中执行投影(选择单个列),并且加载的数量不超过此列。