English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Синтаксис методов LINQ

В предыдущем разделе вы уже узнали о синтаксисе запросов LINQ. Здесь вы узнаете о синтаксисе методов.

Синтаксис методов (также известный как континуальный синтаксис) использует расширяемые методы, содержащиеся в статических классах Enumerable или Queryable, аналогично тому, как вы вызывайте расширяемые методы любого класса.  

Компилятор преобразует синтаксис запроса в синтаксис методов во время компиляции.

Ниже приведен пример запроса с использованием синтаксиса методов LINQ, который возвращает набор строк, содержащий слово «Tutorials».

// 字符串集合
IList<string> stringList = new List<string>() { 
    "C# Tutorials",
    "VB.NET Tutorials",
    "Learn C++",
    "MVC Tutorials",
    "Java" 
};
// Синтаксис LINQ запроса
var result = stringList.Where(s => s.Contains("Tutorials"));

На рисунке показана структура грамматики методов LINQ.

Структура грамматики методов LINQ

Как показано на рисунке, грамматика методов включает расширяемые методы и Lambda-выражения. Расширяемый метод Where(), определенный в классе Enumerable.

Если осмотреть подпись расширяемого метода Where, то можно заметить, что метод Where принимает Делегат predicate Func<Student, bool> означает, что вы можете передать任何 делегат функции, которая принимает объект Student в качестве входного параметра и возвращает значение布尔ского типа, как показано на рисунке. Lambda-выражение используется в качестве делегата, передаваемого в Where. В следующей главе мы рассмотрим Lambda-выражения.

Делегат Func в Where

Ниже приведен пример того, как использовать грамматику методов LINQ с集合ом IEnumerable<T>.

// Сборник студентов
IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
        new Student() { StudentID = 2, StudentName = "Moin", Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill", Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram", Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Ron", Age = 15 } 
    };
// Найти подростков в LINQ с помощью методического синтаксиса
var teenAgerStudents = studentList.Where(s => s.Age > 12 && s.Age < 20)
                                  .ToList<Student>();
// Сборник студентов
Dim studentList = New List(Of Student) From {
        New Student() With {.StudentID = 1, .StudentName = "John", .Age = 13},
        New Student() With {.StudentID = 2, .StudentName = "Moin", .Age = 21},
        New Student() With {.StudentID = 3, .StudentName = "Bill", .Age = 18},
        New Student() With {.StudentID = 4, .StudentName = "Ram", .Age = 20},
        New Student() With {.StudentID = 5, .StudentName = "Ron", .Age = 15}
    }
// Найти подростков в LINQ с помощью методического синтаксиса
Dim teenAgerStudents As IList(Of Student) = studentList.Where(Function(s) s.Age > 12 And s.Age < 20)
                                                       .ToList()

 Темы, которые нужно запомнить

  1. Как следует из названия,Синтаксис методовТак же, как вызов расширяемых методов.

  2. LINQСинтаксис методовТакже известен как Fluent-синтаксис (плавный синтаксис), так как он позволяет выполнять серию вызовов расширяемых методов.

  3. Неявные переменные типа var можно использовать для сохранения результатов запроса LINQ.