LINQ中查询表达式和方法表达式有什么区别?

22

我不确定上面的标题是否合适。

就像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);

我应该在什么情况下使用它们?它们有什么区别吗?


一样的。第一个被称为LINQ表达式,第二个是lambda表达式。 - realnero
2
@realnero 实际上,问题的标题是正确的。查询语法表达式与方法语法表达式。 - J. Steen
3
补充以下回答-如果您使用像[LinqPad]这样的工具,可以自己输入此代码并运行它,然后查看编译后的IL代码。两个语句的代码完全相同。 =) - J. Steen
1
顺便提一下,注意你可以创建一个带有正确的 SelectWhere 等方法(但不是 IQueriable)的类,并且它可以与查询语法一起使用,这些方法将被调用。在这里查看一个有趣的示例:http://bartdesmet.net/blogs/bart/archive/tags/Z3/default.aspx,以及我关于如何设置它的问题:http://stackoverflow.com/questions/15566240/creating-a-type-that-can-be-used-as-a-func-method - George Duckett
5个回答

22

在 LINQ 中,查询表达式会被编译为方法表达式。

C# 中的查询语法和方法语法

由于查询返回的是 IEnumerable 类型,因此您可以通过在方法语法中链接方法调用来组合它们。这就是当您使用查询语法编写查询时编译器在幕后执行的操作。

另请参阅:LINQ 查询表达式 (C# 编程指南)

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

除了一种情况,即无法在查询表达式中获取项目的索引。例如,您可以在方法语法中执行以下操作:

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

在查询表达式中,需要定义外部变量才能实现此目的。以下是类似的讨论,其中包含了来自Jon Skeet的答案。


6

没有

它们之间没有区别。

来自LINQ中的查询语法和方法语法

由于查询返回IEnumerable,因此可以通过将方法调用链接在一起以方法语法组合它们。 当您使用查询语法编写查询时,这就是编译器在幕后执行的操作。并且由于查询变量不存储查询的结果,因此您可以在任何时候修改它或将其用作新查询的基础,即使在执行之后也可以。

还来自LINQ查询表达式

在编译时,查询表达式会转换为标准查询运算符方法调用。


3

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

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

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

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

然而,并非所有方法都有与查询表达式语法相关联的关键字。


1

没有什么区别,这只是个人偏好问题。 如果您想的话,甚至可以混合两种样式。

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


1
实际上,它们没有区别。
实际上,它们是一样的东西,只不过编译器将$a$的表达式转换为等于$b$的表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接