LinqToSql预编译查询有什么好处?

时间:2010-10-06 15:10:11

标签: c# linq linq-to-sql

我正在查看LINJPad提供的示例LINQ查询,这些查询来自于Cuts 4.0中的一本Nutshell书籍,并且遇到了我从未在LINQ to SQL中使用过的东西...编译查询。

这是确切的例子:

// LINQ to SQL lets you precompile queries so that you pay the cost of translating
// the query from LINQ into SQL only once. In LINQPad the typed DataContext is
// called TypeDataContext, so we proceed as follows:

var cc = CompiledQuery.Compile ((TypedDataContext dc, decimal minPrice) =>    
    from c in Customers
    where c.Purchases.Any (p => p.Price > minPrice)
    select c
);

cc (this, 100).Dump ("Customers who spend more than $100");
cc (this, 1000).Dump ("Customers who spend more than $1000");

预编译这样的LINQ to SQL查询实际上是什么给我买的?我是否会从稍微复杂一点的查询中获得性能提升?这甚至用于实际操作?

4 个答案:

答案 0 :(得分:8)

简而言之,当您需要多次运行 时,预编译的查询会为您带来性能提升。

这是关于LINQ To SQL性能的一些information

  

我在几个地方看过   编译你的LINQ会有所帮助,但我   从来没有听过有人怎么说   激烈的速度提升可以。   例如,在我最喜欢的一个   Fabrice的书籍(LINQ in Action)   玛格丽和其他人,他引用了   第296页由Rico Mariani撰写的博客文章   标题为DLINQ(Linq to SQL Performance   (第1部分)说使用编译   查询提供近两倍   执行未编译的查询,   并继续说它带来了   表现在使用a的93%以内   原始数据阅读器。嗯,足够了   说我自己从未参加过测试。一世   本来可以住两次,但不是   37次。

alt text

  

所以,从这看起来,你似乎   应始终编译LINQ to SQL   查询。嗯,那不是真的。   我建议的是,如果你   有理由执行相同的   你应该一遍又一遍地查询   强烈考虑编译。如果是的话   例如,你只是在做一个LINQ   SQL调用一次,没有任何好处   因为无论如何你必须编译它。   叫它十次?好吧,你会的   必须自己决定。

答案 1 :(得分:1)

我使用编译查询的方式是静态的:我静态地声明编译的查询,因此查询树结构只需要解析一次,并且你基本上有一个准备好的语句只需要一些额外的参数。 这主要用于网站,因此查询必须只编译一次。性能提升当然取决于查询的复杂性。

答案 2 :(得分:1)

我们在公司使用此功能,并且对于每次运行通常无需编译的查询。在这会产生影响之前,您不必过度使用linq to sql,但这将取决于服务器上的流量和负载。

答案 3 :(得分:1)

来自article from Rico Mariani的表演花絮

  

Q4:

     

预编译的缺点是什么?   疑问?

     

A:

     

预编译没有任何惩罚   (见测验#13)。唯一的方法   失败的表现就是你预先编译   数以万计的查询,然后几乎不使用   他们在一起 - 你会浪费很多   没有充分理由的记忆。

     

但是衡量:)