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

Meh*_*hdi 2 linq performance lambda join

我想知道在性能方面,使用查询语法或方法语法(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();
Run Code Online (Sandbox Code Playgroud)

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

LINQ - 查询语法与方法链和 lambda

Ren*_*ogt 5

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

可能存在的区别在于此转换使用显式Select调用而不是方法的resultSelector参数Join,但即使如此也不会显着影响性能。

Jon Skeet 的这篇文章帮助我理解了从查询语言到方法语法的转换。


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

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