ctx.Object.Select和obj.Select之间的EF差异

时间:2012-03-22 15:03:00

标签: c# asp.net-mvc entity-framework

今天我遇到了一些有点奇怪的事情。

我使用mini-profiler查看执行的SQL查询。

似乎在使用obj.Children.Select(x => x.Prop1).SingleOrDefault()时执行的查询获取所有列。 但是,使用ctx.Children.Select(x => x.Prop1&& x.IDParent == idObj).SingleOrDefault()只获取Prop1。

知道为什么会有差异吗?

1 个答案:

答案 0 :(得分:2)

因为第一个查询在这里执行:

obj.Children. ...

第二个查询在这里得到了解释:

... .SingleOrDefault()

您获得包含所有列的完整实体的第一个查询,因为导航属性由于延迟加载而加载。加载实体后,您的Select将应用于内存中。当您投影到单个属性时,此时数据库查询已完成。

第二个查询实际上在数据库中执行投影(选择单个列),并且加载的数量不超过此列。