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

我正在查看在Nutshell书中从C#4.0中获取的LINQPad提供的示例LINQ查询,并查看了我从未在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查询实际上是什么让我买? 我是否会从稍微复杂一点的查询中获得性能提升? 这甚至用于实际操作?

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

以下是有关LINQ To SQL性能的一些信息 。

我在几个地方读到编译你的LINQ会有所帮助,但我从来没有听过有人说过速度提升有多么激烈。 例如,在Fabrice Marguerie和其他人最喜欢的一本书(LINQ in Action)中,他在第296页引用了Rico Mariani的博客文章,题为DLINQ(Linq to SQL Performance(第1部分),说使用编译查询几乎提供了两倍于非编译查询的性能,并继续说它使性能达到使用原始数据读取器的93%以内。嗯,足以说我自己从未运行过测试。我可以住两次,但不是37次。

替代文字

因此,似乎您应该始终编译LINQ to SQL查询。 嗯,那不是真的。 我建议的是,如果你有理由一遍又一遍地执行相同的查询,你应该强烈考虑编译。 例如,如果您只是进行一次LINQ to SQL调用,那么没有任何好处,因为您无论如何都必须编译它。 叫它十次? 那么,你必须自己决定。

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

我们在我们公司使用它,并且对于每次运行通常不需要编译的查询。 在这有所不同之前,您不必过度复杂linq to sql,但这将取决于服务器上的流量和负载。

来自 Rico Mariani的Performance Tidbits的这篇文章

Q4:

预编译查询的缺点是什么?

A:

预编译没有任何惩罚(参见测验#13)。 你可能会失去性能的唯一方法是,如果你预先编译了大量的查询,然后几乎不使用它们 – 你就会浪费大量的内存而没有充分的理由。

但衡量:)