C# 持久化实体框架查询缓存

C# 持久化实体框架查询缓存,c#,asp.net-mvc,entity-framework,caching,entity-framework-6.1,C#,Asp.net Mvc,Entity Framework,Caching,Entity Framework 6.1,我有一个ASP.NET MVC 5 web应用程序,并使用EF 6.1访问我的数据库。 我有一些相当复杂的LINQ查询,编译需要10秒,但执行只需几毫秒。EF会很好地缓存该查询,第二次执行该查询时,它会在这几毫秒内返回。 但是这个缓存不是持久的,所以每次应用程序重启时,查询都需要重新编译,这又需要10秒 有没有办法持久保存此查询缓存,使其在应用程序重新启动后仍然有效?您可以使用编译后的查询:或 static readonly Func查询对象不能超出范围。您可以通过将其缓存在会话中或作为应用程序

我有一个ASP.NET MVC 5 web应用程序,并使用EF 6.1访问我的数据库。
我有一些相当复杂的LINQ查询,编译需要10秒,但执行只需几毫秒。EF会很好地缓存该查询,第二次执行该查询时,它会在这几毫秒内返回。
但是这个缓存不是持久的,所以每次应用程序重启时,查询都需要重新编译,这又需要10秒


有没有办法持久保存此查询缓存,使其在应用程序重新启动后仍然有效?

您可以使用编译后的查询:或


static readonly Func查询对象不能超出范围。您可以通过将其缓存在会话中或作为应用程序变量来处理此问题。

感谢您提供的链接,但我已经完成了大部分工作,它不处理查询缓存,只处理模型缓存……查询缓存是QueryCacheManager中的字典。我尝试使用反射保存它,但由于QueryCacheKey和QueryCacheEntry不是公共的,也没有标记为可序列化的,所以不可能。保存/加载查询计划缓存将是一个非常有用的功能,因此您应该在@bmurmistro上创建一个问题:我上个月在/build/与EF团队的Rowan Miller进行了交谈,使用EF 7,这将很容易实现,或者已经“在盒子中”,所以我正在等待EF 7…太棒了!感谢@ChrFinSorry更新,但这没有帮助,因为在我的应用程序执行期间,它们已经被EF缓存。我想持久地存储它,这样它就可以在应用程序重新启动时存活下来……你可以在后台启动应用程序时编译它,这样当你使用它时它就准备好了。如果不可能,您可以将已编译的查询对象序列化为文件,并从中还原它。因此,只有在第一次使用时才缓慢。但是,这只能通过已编译的查询来完成。
static readonly Func<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>> s_compiledQuery2 = 
CompiledQuery.Compile<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>>(
        (ctx, total) => from order in ctx.SalesOrderHeaders
                        where order.TotalDue >= total
                        select order);