2011-03-14 38 views
1

基本上我想知道下面的两条语句是否完全一样。 NerdDinner教程指出IQueryable对象不会查询数据库,直到我们尝试访问/遍历数据或调用ToList为止。因此,除了返回相同的确切项目之外,下面的两个语句的性能与查询数据库有关的性能相同吗?如果我有一百万条记录,会不会比另一条好?这两个陈述是否相同? (来自NerdDinner教程)

我有以下声明:

return from party in entities.Parties 
      where party.PartyDate > DateTime.Now 
      orderby party.PartyDate 
      select party; 

是一样的:

return entities.Parties.Where(p => p.PartyDate > DateTime.Now); 

回答

3

他们将执行完全相同的,是的 - 除了排序。一个非常轻微的变化,他们将编译成完全相同同一代码:

// Extension method syntax 
return from party in entities.Parties 
     where party.PartyDate > DateTime.Now 
     orderby party.PartyDate 
     select party; 

// Query expression 
return entities.Parties 
       .Where(party => party.PartyDate > DateTime.Now) 
       .OrderBy(party => party.PartyDate); 

注意,以及添加OrderBy,我也改变了lambda表达式参数名的名称相匹配,在查询表达式。

实际上,在应用所有常规编译步骤之前,编译器将第一个块转换为第二个块。您可以将查询表达式支持看作有点像预处理器步骤。

我在我的Edulinq博客系列文章Part 41: How Query Expressions Work中更详细地写了这篇文章。

+0

@Saeed:撰写博客帖子和文章的重要部分是,我可以把精力放在* once *上,以便详细解释事情,然后从答案中引用它们这个。 –

+0

听起来很棒Jon。我通过阅读你的博客学到了一些东西(第一条评论只是笑话:) –

0

,除顶层外的一个订单。除此之外,性能几乎相当。

第一个是LinQ语法,第二个是Lambda表达式

0

是的。它们都是相同的,只有第一个命令结果,而第二个命令没有排序。

0

第一个语句转换为拉姆达形式应该是这样的:

return entities.Parties 
       .Where(p => p.PartyDate > DateTime.Now) 
       .OrderBy(p => p.PartyDate) 
       .Select(p => p); 

就性能而言,查询理解语法转换为编译器的lambda语法;它只是语法糖。它们的表现相同,因为它们被编译为相同的表达式。

+0

最后选择是额外的 –