LINQ: запись через точку по сравнению с выражением запроса

Я начинаю использовать LINQ в целом (до сих пор toXML и toSQL). Я видел, что иногда существует два или больше способа достигнуть тех же результатов. Возьмите этот простой пример, насколько я понимаю оба возврата точно то же самое:

SomeDataContext dc = new SomeDataContext();

var queue = from q in dc.SomeTable
        where q.SomeDate <= DateTime.Now && q.Locked != true
        orderby (q.Priority, q.TimeCreated)
        select q;

var queue2 = dc.SomeTable
        .Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
        .OrderBy(q => q.Priority)
        .ThenBy(q => q.TimeCreated);

Идея состоит в том, что существует два способа выразить то же самое; я понимаю, что первый метод имеет некоторые ограничения и что "запись через точку" - больше завершенное, но помимо этого, является там какими-либо другими преимуществами?

57
задан Rowan Richards 11 July 2019 в 10:48
поделиться

5 ответов

"Точечную" нотацию обычно называют синтаксисом Лямбды. Первая нотация идет многими именами, но я обычно называю ее синтаксисом запроса.

я работаю над командой 10 разработчиков, и мы спорим подробно, о котором мы должны использовать в качестве стандарта. В целом более закаленное (с LINQ) разработчики мигрируют к синтаксису Лямбды, но существуют значительные исключения.

Лямбда более кратка, но работает, несколько соединений таблицы являются кошмаром. Соединения являются просто намного более чистыми с синтаксисом запроса. Оборот - то, что существует много операций LINQ, которые только существуют в синтаксисе Лямбды: Единственный (), Сначала (), количество () и т.д.

Так, использование, с чем Вы чувствуете себя больше всего комфортно и понимаете что, как Вы приобретаете опыт, Ваше предпочтение, вероятно, изменится. Существует большое значение в способности считать обоих и конечно, будут ситуации, где необходимо использовать и то, и другое. Другие ситуации предоставят themselve одному стилю по другому. В конце все это переводится в тот же исполняемый код.

54
ответ дан andleer 24 November 2019 в 19:37
поделиться

Ну, 'точечная' нотация может быть намного короче. Возьмите:

var result = from p in dc.Products
             where p.Id > 5
             select p;

или:

var result = dc.Products.Where(p => p.Id > 5);

я предпочитаю последнего, так как это намного короче, и более читаемо.

8
ответ дан Razzie 24 November 2019 в 19:37
поделиться

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

, Где возможно, я стараюсь не смешивать и соответствовать этим двум, хотя иногда это хорошо (если это - единственный вызов к First() в конце запроса, например). Задержанное выполнение означает, что столь же эффективно использовать выражение запроса и присвоить результат переменной и затем использовать запись через точку использование что переменная:

var query = from x in y
            orderby z
            group x by x.Name into groups
            // etc
            select foo;

var page = query.Skip(50).Take(10);

, Поскольку другие сказали, запросите выражения, просто переводятся в "нормальный" C# 3 без выражений запроса, таким образом, нет никакого штрафа за то, что сделали это.

28
ответ дан Jon Skeet 24 November 2019 в 19:37
поделиться

Они компилируют в тот же код, или довольно сначала каждый сначала переводится во второе и затем скомпилированный.

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

Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);
2
ответ дан user76035 24 November 2019 в 19:37
поделиться

Я считаю лямбда-нотацию более аккуратной и лаконичной. Меня просто раздражает то, что если у вас есть лямбда-выражение где угодно внутри вызова метода, вы не можете изменять код на лету в режиме отладки ...

3
ответ дан 24 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: