LINQ中查询表达式和方法表达式的区别?
我不知道上述标题的用语是否合适。
就像a
和b
:
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);
我什么时候应该使用它们? 有什么不同吗?
无,查询表达式编译为方法表达式。
LINQ(C#)中的查询语法和方法语法
因为查询返回IEnumerable,所以可以通过将方法调用链接在一起来在方法语法中组合它们。 当您使用查询语法编写查询时,这就是编译器在幕后所做的事情
另请参阅: LINQ查询表达式(C#编程指南)
在编译时,查询表达式将根据C#规范中规定的规则转换为标准查询运算符方法调用 。 可以使用方法语法表达可以使用查询语法表达的任何查询。 但是,在大多数情况下,查询语法更具可读性和简洁性。 有关更多信息,请参阅C#语言规范和标准查询运算符概述。
除了那个我发现在Query表达式中无法完成的地方之外,还有索引和项目。 例如,您可以在方法语法中执行以下操作:
var result = list.Select((r,i) => new { value = r, index = i});
在查询表达式中,必须定义外部变量才能实现此目的。 以下是与Jon Skeet的回答类似的讨论
没有
它们之间没有区别。
来自Query Syntax and Method Syntax in LINQ
因为查询返回IEnumerable,所以可以通过将方法调用链接在一起来在方法语法中组合它们。 当您使用查询语法编写查询时,这就是编译器在幕后所做的事情。 并且因为查询变量不存储查询结果,所以您可以随时修改它或将其用作新查询的基础,即使在执行之后也是如此。
也来自LINQ Query Expressions
在编译时,查询表达式将转换为标准查询运算符方法调用。
查询表达式由编译器转换为标准方法调用。
var a = from l in list where l % 2 == 0 select l; var b = list.Where(l => l % 2 == 0);
这两个在编译代码中完全相同。
但是,并非所有方法都在查询表达式语法中都有关联关键字。
没有区别,这是个人偏好的问题。 如果你愿意,你甚至可以混合两种风格。
Linq关键字由C#编译器转换为方法调用语法。
事实上,差异是不对的。
实际上,它是同一个东西,除了$ a $的表达式编译器转换为等价于$ b $表达式的表达式。