我正在使用MVC3,.NET4.5,C#,EF5.0,MSSQL2008 R2
我的网络应用程序需要30到60秒才能预热,即通过首页加载。以下页面加载非常快。
我使用DotTrace进行了一些分析。
我发现我的一些LINQ查询,特别是.COUNT和.ANY()的查询需要很长时间才能执行,即:
if (!Queryable.Any<RPRC_Product>((IQueryable<RPRC_Product>) this.db.Class.OfType<RPRC_Product>(), (Expression<Func<RPRC_Product, bool>>) (c => c.ReportId == (int?) myReportId)))
首次使用时大约需要12秒。
你能提供指针,告诉我这些时间是多少。我听说过EF查询的预编译器。
我觉得答案在于使用预编译而不是改变这个特定的查询。
非常感谢提前
修改
刚刚阅读了EF5的自动编译功能,因此第二轮编译查询在缓存中。所以第一次,中间EF语言仍然需要编译。还阅读有关视图的预生成,这些视图通常也有帮助吗?
答案 0 :(得分:1)
正如您所说 - 您不必担心编译查询 - 它们由ef自动缓存。预生成视图可能对您有所帮助。用于脚手架的自动工具不会产生所有需要的视图,并且仍然需要在运行时创建缺少的视图。当我开发我的解决方案并期望与您相同的问题时,唯一帮助我的是简化查询。事实证明,如果要运行的第一个查询非常复杂并且涉及复杂的连接,那么ef需要生成许多视图来执行它。所以我简化了查询 - 而不是加载整个连接的实体我只加载了ID(分组,过滤掉或其他),然后当我需要加载单个实体时,我逐个加载ID。这使我可以避免第一次查询的执行时间过长。