2013-01-02 46 views
2

我正在分析一个ASP.NET Web应用程序,我注意到我的EF4执行计划未被缓存。每次加载页面时,所有的Linq表达式都将被重新编译,如下面的屏幕截图所示。使用实体框架将Linq缓存到实体执行计划4

dotTrace

有什么办法,我可以告诉EF4缓存这些执行计划?

编辑:

这是我的查询是这样的:

var objs = db.Table 
    .Include("OtherTable") 
    .Where(g => 
     (someId != null || g.ID == someId) && 
     (g.ObjType == someType) && 
     (/* etc */)) 
    .ToList(); 

回答

2

看看Query Plan Caching。如果你的查询被低效地创建,它们可能不会被缓存。

此外,还为每个应用程序域缓存每个执行计划。所以在ASP.Net中,这与AppPool相同,如果您正在AppPool关闭或重新启动,则清除缓存。

+0

我不确定您的链接是否适用于我的案例。我不是手工编写SQL。我用一些代码更新了我的问题。 – lzm

+0

你为什么不认为这个链接适用?它仅在动态查询的上下文中讨论原始SQL。其余适用于Linq-to-Entities。 –

+0

+1当清除缓存时,还有[缓存逐出(部分3.2.2)](http://msdn.microsoft.com/en-us/data/hh949853),它确保缓存仅保存800项 – FRoZeN