我发现页面非常有趣:http://msdn.microsoft.com/en-us/library/cc853327.aspx
在查询阶段,您可以看到,有一个名为“生成视图”的阶段将花费很多。即使EF提供了一些预编译方法,但如果你有很多查询没有预编译,你仍然可能会遇到问题。
您可以在此处找到如何:预生成视图以提高查询效果:http://msdn.microsoft.com/en-us/library/bb896240.aspx
在这里,您可以看到没有预生成的查询将花费两倍的时间。这意味着它确实花了很多钱。 http://blogs.msdn.com/b/appfabriccat/archive/2010/08/06/isolating-performance-with-precompiled-pre-generated-views-in-the-entity-framework-4.aspx
所以我有一个问题,为什么EF设计这个阶段? NHibernate也有这个阶段吗?如果是真的,那么它在Nhibernate中的表现怎么样?
答案 0 :(得分:3)
EF视图与SQL视图无关 - EF视图将映射转换编译为可执行代码。 EF使用这些转换将其查询表示转换为目标SQL表示。这种编译的原因是整个应用程序的性能 - 您需要花时间进行初始化,但所有后续查询和更新都将使用编译代码而不是EDM中的某些查找。如果您不需要在运行时修改映射,您甚至可以在编译应用程序期间预编译这些视图。
EF视图用于查询准备(将一种表示转换为另一种表示),但必须为每个唯一查询完成查询准备。在EF 4中,除非您手动使用Compiled query,否则不会缓存此准备工作。在EF 4.5和5.0(.NET 4.5)中,所有查询都自动“编译”=存在缓存,每个唯一查询实际上只准备一次。后续执行相同的查询使用缓存中的编译版本。
您可以在this beginner guide中了解有关效果和EF 5.0的更多信息。