LINQ: Точечная запись или выражение запроса

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

SomeDataContext dc = new SomeDataContext(); var queue = from q in dc.SomeTable where q.SomeDate  q.SomeDate  q.Priority) .ThenBy(q => q.TimeCreated); 

Помимо любой ошибки, которую я мог бы сделать в синтаксисе или недостающем параметре или различии, идея состоит в том, что есть два способа выразить одно и то же; Я понимаю, что первый метод имеет некоторые ограничения и что «точечное обозначение» более полно, но кроме того есть ли другие преимущества?

«Точечную» нотацию обычно называют синтаксисом lambda. Первая запись относится к числу имен, но я обычно называю ее синтаксисом запроса.

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

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

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

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

По возможности, я стараюсь избегать смешивания и сопоставления двух, хотя иногда это нормально (если, например, это один вызов 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 без выражений запроса, поэтому для этого не существует штрафа.

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

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

или:

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

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

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

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

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

 Func isEven = i => i%2 == 0; Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine); 
  • Linq с группой с подсчетом
  • Linq выбирает объекты в списке, где существует IN (A, B, C)
  • Найти элемент в списке по LINQ?
  • Каковы преимущества отложенного выполнения в LINQ?
  • Entity Framework: уже существует открытый DataReader, связанный с этой командой
  • Linq Query Group и выбор первых элементов
  • Используя LINQ для поиска элемента в списке, но получите «Значение не может быть нулевым. Имя параметра: источник "
  • Выберите синтаксический анализ int, если строка была подвержена анализу int
  • условные include в linq для объектов?
  • Установить связь между двумя списками в linq с объектами, где предложение
  • LINQ - Синтаксис запроса против цепей методов и lambda
  • Давайте будем гением компьютера.