День сто семьдесят четвёртый. #BestPractices

Когда использовать LINQ с синтаксисом запроса вместо методов. Начало

Выражения LINQ можно написать в двух вариантах - синтаксис запроса и синтаксис методов. Например, следующие запросы идентичны:

var numbers = Enumerable.Range(1, 100); //1,2,...,100

//Запрос:

var query = from n in numbers

where n % 3 == 0

select n * 2;

//Методы:

var method = numbers

.Where(n => n % 3 == 0)

.Select(n => n * 2);



По некоторым причинам большинство разработчиков (включая меня) чувствуют себя более комфортно с синтаксисом методов. Возможно, причина в том, что программисты привыкли к регулярным вызовам методов. В отличие от синтаксиса запроса, который является своего рода новым языком (ну, вроде как SQL, но он все же менее привычен, чем C#).

Нет никакого явного преимущества одного синтаксиса над другим. Фактически любой синтаксис запроса может быть преобразован в синтаксис методов.

Однако есть несколько случаев, когда синтаксис запроса лучше, то есть он делает код более читабельным:



1. Ключевое слово "let"

Ключевое слово let позволяет сохранить результат для последующего использования в запросе. Вот пример:

var querySyntax =

from person in people

let yearsWorking = GetYearsWorking(person)

where yearsWorking > 4

orderby yearsWorking

select person.Name;



var methodSyntax = people

.Select(person => new {

YearsWorking = GetYearsWorking(person), Name = person.Name })

.Where(x => x.YearsWorking > 4)

.OrderBy(x => x.YearsWorking)

.Select(x => x.Name);

Как видите, с синтаксисом запросов все красиво и чисто. Синтаксис метода не является ужасным, но он требует создания анонимные классов и использования их в остальной части запроса. Поэтому, когда вы хотите «сохранить» значение в дополнение к запрашиваемой коллекции, рассмотрите возможность использования предложения let.



2. OrderBy по нескольким полям

Как в синтаксисе запроса, так и в синтаксисе методов вы можете легко выполнить упорядочивание по нескольким полям. Например, мы можем упорядочить людей по возрасту, а затем по доходу, где возраст - первый, а доход - второй. Это означает, что люди с одинаковым возрастом будут упорядочены по доходам:

var people = new Person[]

{

new Person() {Age = 20, Income = 5000, Name = "Peter"},

new Person() {Age = 30, Income = 8000, Name = "Alfredo"},

new Person() {Age = 30, Income = 7000, Name = "Bo"},

new Person() {Age = 20, Income = 4000, Name = "Jo"},

new Person() {Age = 20, Income = 6000, Name = "Amanda"},

new Person() {Age = 30, Income = 5500, Name = "Maxim"},

};



var querySyntax = from person in people

orderby person.Age, person.Income

select $"{person.Age} {person.Income} {person.Name}";

var methodSyntax = people

.OrderBy(person => person.Age)

.ThenBy(person => person.Income)

.Select(person => $"{person.Age} {person.Income} {person.Name}");



//result

//20 4000 Jo

//20 5000 Peter

//20 6000 Amanda

//30 5500 Maxim

//30 7000 Bo

//30 8000 Alfredo

Я признаю, что оба варианта хороши, и разница не так велика, как в других случаях. Но синтаксис запроса все же выглядит лучше.



Продолжение следует…



Замечание: как и в большинстве руководств по стилю кодирования, вышеизложенное является сугубо личным мнением.



Источник:
https://michaelscodingspot.com/