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

The*_*Sky 5 c# linq linq-to-entities

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

CompiledQuery.Compile(query);
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*rey 1

据我所知,它与带有嵌入参数的硬编码 SQL 查询和使用命名参数的 SQL 查询具有大致相同的优点:系统可以识别它们都是相同的并使用相同的查询计划。

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

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