Entity framework EF6查询预编译

Entity framework EF6查询预编译,entity-framework,linq-to-entities,entity-framework-6,Entity Framework,Linq To Entities,Entity Framework 6,是否有一种方法可以预编译EF查询,这样应用程序就不需要编译它(即使它是第一次执行) 我有很多复杂的查询,当使用L2E时需要一些时间来执行。例如,对于我基准测试的Sql Server profiler报告的一个查询,执行时间约为300毫秒,但实际上,该查询在我的PC上大约4.5秒后完成(Xeon四核2.6 GHz,8GBs内存。这意味着我的电脑正在等待数据到达大约0.5秒,并花费大约4秒来编译和执行查询,最后在我的电脑上读取数据(仅4条记录)。这是一段很长的时间,尤其是在ToListAsyns()

是否有一种方法可以预编译EF查询,这样应用程序就不需要编译它(即使它是第一次执行)

我有很多复杂的查询,当使用L2E时需要一些时间来执行。例如,对于我基准测试的Sql Server profiler报告的一个查询,执行时间约为300毫秒,但实际上,该查询在我的PC上大约4.5秒后完成(Xeon四核2.6 GHz,8GBs内存。这意味着我的电脑正在等待数据到达大约0.5秒,并花费大约4秒来编译和执行查询,最后在我的电脑上读取数据(仅4条记录)。这是一段很长的时间,尤其是在ToListAsyns()之后)在实际查询发送到数据库之前,不会将控制权返回到UI,因此这意味着我的应用程序的所有4秒钟都“挂起”。解决方法之一是使用Task.Run()而不是toListSync,但这只允许我的应用程序显示一些等待信号,仍然会有4s的延迟


在一些较旧的PC上,这可能意味着用户将等待10秒进行查询编译,而这并不是所需要的。因此,有人知道我如何预编译所有查询,以便即使在第一次执行查询时也不会延迟吗?

我相信您正在寻找的概念是“预生成映射视图”

在搜索该功能的同时,我还发现了这篇最近的相关文章-


请注意,在EF 5中,添加了自动编译行到实体查询的支持,因此不再每次都进行编译-

实体框架2011年6月CTP支持一种称为自动编译LINQ查询的新功能。现在,自动执行的每个LINQ到实体查询都会被编译并放入EF的查询cach中e、 每次运行查询时,EF都会在其查询缓存中找到该查询,而不必再次执行整个编译过程。如果禁用查询,则该查询将不起作用cache@Legends这不是真正的解决方案,原因有二:1)在桌面应用程序中,一些查询一天只能执行一次,这意味着查询实际上永远不会被编译,2)我的大多数查询都包含可枚举的。包含在where查询中。这在执行SP时可以正常工作,您可以使用TVP(EF支持),但在使用L2E时,每次执行查询时,都会生成一个新查询,因此没有自动查询编译。我不是EF极客,但作为一种解决方法,我建议您在应用程序启动时异步预编译所有查询,,例如,您有30个查询,但按顺序排列,最常用的查询首先在编译执行管道中编译,不太常用的查询稍后在编译执行管道中编译。数据库在客户端或服务器上的什么位置?如果是服务器端的一个,则放弃LTE并使用纯T-SQL,这样执行计划将缓存在数据库中。如果db位于客户端,这可能也会起作用,但无法确认。问题是,在L2E查询中使用Enumerable.Contains(…)时,它们无法被编译,这是我在阅读相关主题时发现的。正如我在之前的评论中所说,TVP在EF6中可以正确地与SP一起工作,但客户机的决定是为了可维护性而不使用SPs。我有同样的问题:使用EF6时,我多次调用的查询没有预编译,并且需要很长时间才能完成。查询既长又复杂,每次调用它(字符串)时,我只会发送不同的输入参数来调用它。我已经尝试了所有方法,但仍然不起作用(我没有调用Enumerable.Contains(…)这是唯一的限制。知道为什么吗?对此非常失望,任何帮助都会得到感谢。不,这不是我要说的,视图将在第一次执行查询时生成,这通常是在应用程序启动时。我要说的是预编译一个复杂的查询,这样EF6就不需要每次执行L2E查询时都生成一个。and基于我到目前为止读到的内容,如果您有复杂的L2E查询,它有如下内容:where Enumerable.Contains(x.Id),使用当前版本的EF6不可能实现这一点,而且每次执行查询时,您肯定会受到编译性能的影响。我已经更新了我的答案,以包含将LINQ编译为实体查询的单独主题。您正确的是,使用
IEnumerable.Contains(T值)的查询
无法缓存。尽管上一篇文章指出EF 6中的查询性能有所提高。我已经知道EF6中的自动编译功能,并且我已经在问题注释中与@Legend讨论过。这对我描述的问题没有帮助。我觉得我的答案是有效的。预生成映射视图将导致在第一次执行查询时跳过该步骤。从您的问题来看,这似乎就是您所寻求的。