2012-08-29 71 views
2
string id = (from c in context.Users 
      where c.u_id == Id 
      select c.u_id).SingleOrDefault(); 

1)如何使用Linq符合上面的查询来改善上述性能。 我们仅限于使用.NET 3.5。Linq to SQL到Linq编译的性能

2)以百分比的形式使用以上代码的编译linq查询的性能增益是多少?

回答

3

您将创建编译查询通过:

Func<YourContextType, int, string> query = CompiledQuery.Compile(
     (YourContextType context, int id) => 
      context.Users.Where(u => u.u_id == id).Select(u => u.u_id) 
        .SingleOrDefault() 
     ); 

你可以这样使用它作为:

string resultId = query(context, Id); 

至于性能增益,这可能是显著,但它也可能微乎其微。这实际上取决于查询执行的速度,以及您可以重复使用编译查询的频率。在许多情况下,使用cmopped查询实际上是较慢的,因为编译的开销并不能弥补速度的提升。您需要进行测量以确定这是否值得。

请注意,如果您知道只有一个唯一的ID,则还可以使用FirstOrDefault()而不是SingleOrDefault()来加速原始查询。

+0

不要忘了,如果你在web上下文中使用** static ** 这样查询就会编译一次而不是每个请求 – nicolas

1

声明你的编译的查询是这样的:

static readonly Func<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE> compiledQuery = 
CompiledQuery.Compile<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE>(
(ctx, Id) => (from c in ctx.Users 
where c.u_id == Id 
select c.u_id).SingleOrDefault(); 

然后在你的代码中调用编译后的查询:

RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id); 

而且关于能够依赖于几件事情的性能改善,但是要记住在LINQ查询执行的范围内,查询编译是该过程的一个昂贵部分。任何时候,如果您将LINQ查询逻辑添加到基于LINQ to SQL或Entity Framework的应用程序中,则应考虑预编译查询并重新使用它们。

1

一个厚颜无耻的选择将是:不涉及LINQ这样一个微不足道但性能关键的操作。例如,用短小精悍点网:

string id = connection.Query<string>(
    @"select u_id from Users where u_id = @id", 
    new { id = Id }).SingleOrDefault(); 

从而彻底避免了所有的LINQ抽象,直接对数据库(完全无参数等)上的倾斜。