LINQ中查询表达式和方法表达式的区别?

时间:2013-03-28 09:12:44

标签: c# linq

我不知道上述标题的用语是否合适。

就像ab

一样
var list = Enumerable.Range(0, 100);

var a = from l in list
        where l % 2 == 0
        select l;
var b = list.Where(l => l % 2 == 0);

我什么时候应该使用它们?还有什么不同吗?

5 个答案:

答案 0 :(得分:20)

无,查询表达式编译为方法表达式。

Query Syntax and Method Syntax in LINQ (C#)

  

因为查询返回IEnumerable,所以用方法组合它们   通过将方法调用链接在一起的语法。这是什么的   当您使用查询语法

编写查询时,编译器会在幕后进行

另见:LINQ Query Expressions (C# Programming Guide)

  

在编译时,查询表达式将根据C#中规定的规则转换为标准查询运算符方法调用   规格。可以使用查询语法表达的任何查询   也可以使用方法语法表达。但是,在大多数情况下   查询语法更具可读性和简洁性。有关更多信息,请参阅   C#语言规范和标准查询运算符概述。

除了我发现在Query表达式中无法完成的某个地方之外,还要将索引与项目一起获取。例如,您可以在方法语法中执行以下操作:

var result = list.Select((r,i) => new { value = r, index = i});

在查询表达式中,必须定义外部变量才能实现此目的。以下是与answer from Jon Skeet

的类似讨论

答案 1 :(得分:6)

它们之间没有区别。

来自Query Syntax and Method Syntax in LINQ

  

因为查询返回IEnumerable,所以用方法组合它们   通过将方法调用链接在一起的语法。 这是什么的   当您使用查询编写查询时,编译器会在幕后进行   语法。并且因为查询变量不存储结果   查询,您可以修改它或将其用作任何新查询的基础   时间,即使它已被执行。

同样来自LINQ Query Expressions

  

在编译时,查询表达式将转换为标准查询   操作员方法调用。

答案 2 :(得分:3)

查询表达式由编译器转换为标准方法调用。

var a = from l in list
        where l % 2 == 0
        select l;

var b = list.Where(l => l % 2 == 0);

这两个在编译代码中完全相同。

但是,并非所有方法都在查询表达式语法中都有关联关键字。

答案 3 :(得分:1)

没有区别,这是个人偏好的问题。如果你愿意,你甚至可以混合两种风格。

Linq关键字由C#编译器转换为方法调用语法。

答案 4 :(得分:1)

事实上,差异是否定的 实际上,它是同一个东西,除了$ a $的表达式转换为等价于$ b $表达式的表达式。