这两个陈述是否相同? (来自NerdDinner教程)

时间:2011-03-14 07:15:14

标签: sql linq

基本上我想知道下面的两个陈述是否最终完全相同。 NerdDinner教程声明IQueryable<>在我们尝试访问/迭代数据或在其上调用ToList之前,对象不会查询数据库。那么除了返回相同的确切项目之外,下面的两个语句在查询数据库方面也表现相同吗?如果我有一百万条记录,那么一个会比另一个更好吗?

我有以下声明:

    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);

4 个答案:

答案 0 :(得分: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表达式参数名称的名称以匹配查询表达式中的名称。

有效地,编译器在应用所有正常编译步骤之前将第一个块转换为第二个块。您可以将查询表达式支持视为有点像预处理器步骤。

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

答案 1 :(得分:0)

,但排名前一的订单除外。除此之外,性能几乎相同。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

转换为lambda表单的第一个语句如下所示:

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

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