【问题标题】:What should you use for joining in LINQ, Query syntax or method syntax?您应该使用什么来加入 LINQ、查询语法或方法语法?
【发布时间】:2017-07-26 11:46:35
【问题描述】:

我想知道在性能方面使用查询语法或方法语法(Lambda 表达式)连接两个实体有什么区别?

我已经知道,总的来说,查询语法和方法语法在结果方面没有区别。但是,对于加入其中哪一个更好地使用性能? 下面是示例代码:

var queryResult = (from p in People
                       join i in Incomes
      on p.PersonId equals i.PersonId
                       select new { p.PersonId, p.Name, p.Age, i.Amount }
                      ).ToList();

        var lambdaResult = People.Join(Incomes,
                      p => p.PersonId,
                      i => i.PersonId,
                     (p, i) => new { p.PersonId, p.Name, p.Age, i.Amount }).ToList();

我已经浏览过这些网站,但没有提及加入 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/query-syntax-and-method-syntax-in-linq

LINQ - Query syntax vs method chains & lambda

【问题讨论】:

    标签: performance linq join lambda


    【解决方案1】:

    没有区别。您的第一个版本(查询语言)在词法上被翻译成第二个版本(方法语法)“真正的”编译之前。查询语言只是语法糖并转化为方法调用。然后编译这些调用(如果可能 - 翻译本身并不关心结果的正确性,例如,如果 People.Join 甚至是有效的 C# 并且在任何 People 可能存在这样的 Join 方法)。

    可能存在差异,因为此转换使用显式 Select 调用而不是 Join 方法的 resultSelector 参数,但即使这样也不会显着影响性能。

    Jon Skeet 的This article 帮助我理解了从查询语言到方法语法的转换。


    要回答“您应该使用什么”这个问题:这完全取决于您。考虑:

    • 您(和您的同事!)更容易阅读/理解的内容!
    • 复杂的查询通常在查询语法中更具可读性,类似 SQL 的样式比长链的方法调用更容易阅读
    • 请注意,每个查询语法表达式都可以表示为方法调用,但并非所有方法调用都可以表示为查询语法
    • 在单个查询中混合使用两种语法通常比坚持使用其中一种更容易混淆

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多