今天我遇到了一些奇怪的事情。
我使用迷你分析器来查看执行的 SQL 查询。
似乎在使用 obj.Children.Select(x => x.Prop1).SingleOrDefault() 时执行的查询获取所有列。 但是,使用 ctx.Children.Select(x => x.Prop1 && x.IDParent == idObj).SingleOrDefault() 仅获取 Prop1。
知道为什么会有差异吗?
最佳答案
因为第一个查询在这里执行:
obj.Children. ...
第二个查询在这里执行:
... .SingleOrDefault()
您将获得对包含所有列的完整实体的第一个查询,因为导航属性是由于延迟加载而加载的。加载实体后,您的 Select
将应用到内存中。当您投影到单个属性时,数据库查询此时已经完成。
第二个查询实际上在数据库中执行投影(选择单个列),并且不会加载超过此列的内容。
关于c# - EF ctx.Object.Select 和 obj.Select 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824925/