【问题标题】:Difference between Query Expression and Method Expression in LINQ?LINQ中查询表达式和方法表达式的区别?
【发布时间】:2013-03-28 20:23:54
【问题描述】:

我不知道上面的标题是否合适。

就像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 实际上,问题的标题是正确的。查询语法表达式 vs 方法语法表达式。
  • 补充下面的答案——如果你使用linqpad之类的工具,你可以自己输入这段代码并运行它,然后查看IL编译的代码。这两个语句的代码完全相同。 =)
  • 顺便说一句,请注意,您可以使用正确的 SelectWhere 等方法(但不能使用 IQueriable)创建一个类,并且它可以与查询语法和方法会被调用。请参阅此处以获取一个有趣的示例:bartdesmet.net/blogs/bart/archive/tags/Z3/default.aspx 以及我在此处设置它的问题:stackoverflow.com/questions/15566240/…

标签: c# linq


【解决方案1】:

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

Query Syntax and Method Syntax in LINQ (C#)

因为查询返回一个 IEnumerable,所以你将它们组合在方法中 通过将方法调用链接在一起的语法。这就是 当您使用查询语法编写查询时,编译器会在幕后工作

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

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

除了我发现在查询表达式中无法完成的事情的一个地方是获取索引以及项目。例如,您可以在方法语法中执行以下操作:

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

在查询表达式中必须定义一个外部变量来实现这个目的。这是与answer from Jon Skeet的类似讨论

【讨论】:

    【解决方案2】:

    没有

    它们之间没有区别。

    来自Query Syntax and Method Syntax in LINQ

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

    同样来自LINQ Query Expressions

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

    【讨论】:

      【解决方案3】:

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

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

      这两者在编译后的代码中完全一样。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          其实不同的是,没有。
          实际上,这是一回事,只是编译器将 $a$ 的表达式转换为与 $b$ 的表达式等效的表达式。

          【讨论】:

            猜你喜欢
            • 2010-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多