5

我有一个ASP.NET MVC 5网络应用程序,并使用EF 6.1来访问我的数据库。
我有一些相当复杂的LINQ查询需要10s来编译,但随后在几毫秒内执行。 EF会缓存这些查询,并在第二次执行查询时在几毫秒内返回。
但是这个缓存并没有被保存,所以每个应用程序都重新启动,需要重新编译这个查询,这又需要10秒钟。坚持实体框架查询缓存

有没有办法坚持这个查询缓存,以便它在应用程序重新启动?

+0

http://www.fusonic.net/zh/blog/2014/07/09/three-steps-for-fast-entityframework-6.1-first-query-performance/ – 2014-09-27 21:36:39

+0

感谢您的链接,但我已经做大部分这一点,它不处理查询缓存,但只处理模型缓存...... – ChrFin 2014-09-28 07:56:13

+1

查询缓存是QueryCacheManager中的一个Dictionary 。 我尝试使用反射来保存它,但由于QueryCacheKey和QueryCacheEntry未公开,并且未标记为可序列化,因此这是不可能的。 保存/加载查询计划缓存将是一个非常有用的功能,所以你应该在http://entityframework.codeplex.com/workitem/list/advanced上创建一个问题 – 2014-11-21 12:23:47

回答

0

,您可以使用编译查询:see herehere

但是如前所述here查询对象不能超出范围。您可以通过将其保存在会话中或作为应用程序变量来处理此问题。

+1

对不起,但这没有帮助,因为在执行我的应用程序时,它们已经被EF缓存。我想要存储这个*持久*所以它应用程序重新生存... – ChrFin 2014-11-17 12:07:06

+0

你可以在应用程序启动时在后台编译它,所以它已经准备好,当你使用它。如果这是不可能的,你可以序列化编译的查询对象到文件并从那里恢复。因此只有第一次使用是很慢的。但是这只能通过编译查询来完成。 – Vanice 2014-11-17 13:07:50