LINQ to Entities 4.0查询是否默认编译?

时间:2010-06-25 18:50:13

标签: c# linq linq-to-entities

我最近刚开始每天使用LINQ。我已经阅读了很多关于L2E查询应该被编译以使用以下内容来提高性能:

CompiledQuery.Compile(query);

使用 LINQ-To-Entities 4.0 我运行了10次未编译的查询,然后编译并在几秒钟内得出以下结果:

// Sample Query
from u in ctx.Users orderby u.Id, u.Username select u

Uncompiled  Compiled
---------------------
0.295       0.2946174
0.024       0.0220462
0.008       0.0060126
0.013       0.0210441
0.007       0.010021
0.011       0.010021
0.008       0.0060126
0.009       0.0070147
0.008       0.0060126

正如你所看到的,我的小测试时间并没有真正的巨大差异。第一次调用的时间较慢,然后都加速(意味着编译/缓存)。任何人都可以提供这方面的见解吗?

2 个答案:

答案 0 :(得分:1)

从我可以收集的内容来看,它具有与使用命名参数的SQL查询嵌入参数的硬编码SQL查询相同的好处:系统可以识别它们都是相同的并使用相同的查询计划。 / p>

例如,如果您只是简单地内联上面的表达式,那么如果您总是传入相同的ctx.Users对象,它可能与编译它一样好。但是,如果您有多个相同类型的用户存储库并且计划在所有这些存储库上使用order by,那么最好先编译一次查询并使用参数来访问它。

在研究这个时,我看了一下如何在IL中形成LINQ查询:每次调用它时,都会为LINQ查询中的每个子句创建一个新的Func<>委托。仅仅因为这个原因,我认为,就内存抖动而言,编译查询对你的系统会更好。

答案 1 :(得分:0)

你可能没有处理上下文。查询在上下文中缓存,但编译它们允许您跨多个上下文使用它们。很难确定,因为你实际上没有显示完整的代码。