您应该使用什么来加入LINQ,查询语法或方法语法?

时间:2017-07-26 11:46:36

标签: performance linq join lambda

我想知道在性能方面,使用查询语法或方法语法(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

1 个答案:

答案 0 :(得分:4)

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

这种翻译可能会使用明确的Select调用而不是resultSelector方法的Join参数,但可能会对性能产生不可估量的影响。

Jon Skeet的

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

回答问题"你应该使用什么":这完全取决于你。考虑:

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