跳转至

方法语法⚓︎

查询语法和方法语法是编写 LINQ 表达式的两种方式。介绍性的语言集成查询(LINQ)文档中的大多数查询是使用 LINQ 声明性查询语法编写的。 但是在编译代码时,查询语法必须转换为针对 .NET 公共语言运行时 (CLR) 的方法调用。 这些方法调用会调用标准查询运算符( WhereSelectGroupByJoinMax 和 Average 等),也可以使用方法直接调用它们,这种方式称为方法语法

Note

查询语法和方法语法在语义上是相同的,但是查询语法更简单且更易于阅读,并且某些查询必须表示为方法调用。 例如,必须使用方法调用表示检索与指定条件匹配的元素数的查询。

下面示例展示了查询语法和方法语法的使用,它们在功能上是等效的。

class QueryVMethodSyntax
{
    static void Main()
    {
        int[] numbers = { 5, 10, 8, 3, 6, 12};

        //查询语法 Query syntax:
        IEnumerable<int> numQuery1 =
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

        //方法语法 Method syntax:
        IEnumerable<int> numQuery2 = numbers
            .Where(num => num % 2 == 0)
            .OrderBy(n => n);

        foreach (int i in numQuery1)
        {
            Console.Write(i + " ");
        }

        Console.WriteLine(System.Environment.NewLine);

        foreach (int i in numQuery2)
        {
            Console.Write(i + " ");
        }
    }
}
/*
    Output:
    6 8 10 12
    6 8 10 12
 */

上述示例中的输出相同,并且查询变量具有相同的类型。在查询语法中使用了 whereorderby 关键字实现条件筛选和排序;在方法语法中则通过调用 Where()OrderBy() 方法实现。

通过查看  IEnumerable<T> 接口可以了解到,该接口没有这些方法,它们以扩展方法的形式存在,并且可以在 Visual Studio IDE 中调用。这些用于完成查询的扩展方法就是标准查询运算符。 从应用程序的角度来看,扩展方法与常规实例方法是相同的。

Info

更多标准查询运算的使用可以参考后续 标准查询运算符 下的相关内容,或者通过链接自行查看 IEnumerable<T> 接口相关内容。