This article is currently in the process of being translated into Russian (~98% done).
LINQ: Query Syntax vs. Method syntax
В предыдущей статье мы бегло ознакомились с тем как выглядят оба синтаксиса LINQ. Для того, чтобы вы понимали то, что мы будем обсуждать в этой статье, давайте вновь запишем оба синтаксиса рядом друг с другом:
var listOfNames = new List<string>()
{
"John Doe",
"Jane Doe",
"Jenna Doe",
"Joe Doe"
};
// Query syntax
var qNames = from name in listOfNames where name.Length <= 8 select name;
// Method syntax
var mNames = listOfNames.Where(name => name.Length <= 8);
Хотя две строки будут выполнять одно и то же, синтаксическое различие совершенно очевидно: синтаксис запроса больше похож на другие языки запросов, например, SQL и меньше как обычный оператор C #. Синтаксис метода, с другой стороны, очень похож на остальную часть кода C #, который вы видели в этом руководстве.
Итак, самое большое различие, безусловно, заключается только в синтаксисе, и поэтому вы увидите оба варианта, используемые при чтении статей на C # и поиске ответов на вопросы, которые у вас могут возникнуть. Похоже, что синтаксис запроса немного более популярен, потому что некоторым людям он кажется более удобным для чтения, чем синтаксис метода - возможно, это люди, которые в любом случае привыкли выражать операции извлечения данных в SQL. С другой стороны, если вы никогда раньше не использовали язык запросов, такой как SQL, но у вас есть некоторый опыт работы с C#, то вам может показаться, что синтаксис метода легче читать. Кроме того, по крайней мере для пары операций, таких как подсчет элементов в результате запроса, вам придется использовать синтаксис метода.
Лямбда выражения
В примере синтаксиса метода вы можете заметить нечто, чего раньше не видели, в качестве параметра метода Where(). Это выглядит примерно так:
name => name.Length <= 8
Это называется лямбда-выражением, и хотя это не является специфической частью функциональности LINQ, оно ЧАСТО используется в мире LINQ. Поэтому вы также часто увидите это в следующих статьях, и хотя я более подробно расскажу о лямбда-выражениях в другой статье, сейчас самое время получить самое общее представление о том, как они работают.
На самом деле это довольно просто. Лямбда-выражение имеет левую и правую части, разделенные оператором => (не путать с оператором "больше или равно", который выглядит следующим образом: >=).
С левой стороны у нас есть входные параметры - их может быть несколько, но в нашем примере есть только один, который является переменной name. В данном случае это происходит из метода Where(), из перебора нашего списка имен, и мы получаем возможность выбрать имя. Я выбрал "name", потому что это то, что вы найдете в списке имен, но вы также можете назвать это "x", "z", "foobar" или как-нибудь еще.
С правой стороны у нас есть часть выражения/утверждения. Именно здесь мы генерируем ожидаемый результат - в данном случае логическое значение, указывающее методу Where(), включать ли рассматриваемое имя или нет. Мы отвечаем на это выражением, говоря, что мы хотим включить имя, если оно имеет длину 8 (или меньше) символов. Мы можем (но не обязаны) использовать входные данные (левая сторона), чтобы определить это. Опять же, мы называем его "name", но вместо этого мы могли бы назвать его "x" - в этом случае оператор выглядел бы следующим образом:
var mNames = listOfNames.Where(x => x.Length <= 8);
Лямбда-выражения - это нечто большее, чем просто запросы LINQ, но, как уже упоминалось, они важны при использовании LINQ - вы увидите это в следующих статьях. Если вы хотите узнать больше о лямбда-выражениях в целом, загляните в другое место этого руководства, где будет рассмотрена эта тема.
Summary
LINQ поставляется в двух синтаксических вариантах: синтаксис запроса и синтаксис метода. Они могут делать почти то же самое, но в то время как синтаксис запроса является почти новым языком в C #, синтаксис метода выглядит точно так же, как обычные вызовы методов C #. В этом руководстве мы в основном будем использовать синтаксис метода, когда мы обсудим все возможные операции, доступные с LINQ в следующих статьях.