【问题标题】:How to decrease the startup time of this LINQ-EF query? Precompiled EF Queries?如何减少此 LINQ-EF 查询的启动时间?预编译的 EF 查询?
【发布时间】:2014-06-19 19:13:20
【问题描述】:

我正在使用 MVC3、.NET4.5、C#、EF5.0、MSSQL2008 R2

我的 Web 应用程序可能需要 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 语言。还阅读了视图的预生成,这通常也会有所帮助?

【问题讨论】:

    标签: linq entity-framework linq-to-entities entity-framework-5


    【解决方案1】:

    正如您所说-您不必担心编译查询-它们由 ef 自动缓存。预生成的视图可能会对您有所帮助,也可能不会。用于搭建它们的自动工具不会生成所有需要的视图,缺少的视图仍然需要在运行时生成。当我开发我的解决方案并期望遇到与您相同的问题时,唯一对我有帮助的是简化查询。事实证明,如果要运行的第一个查询非常复杂并且涉及复杂的连接,那么 ef 需要生成许多视图来执行它。所以我简化了查询——我只加载了 ids(分组、过滤或其他)而不是加载整个连接的实体,然后当我需要加载单个实体时,我通过 ids 一个一个地加载它们。这让我可以避免第一次查询的执行时间过长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多