Беглое выражение и выражение запросов - есть ли преимущества одного перед другим?

LINQ - одно из величайших улучшений .NET со времен дженериков, и он экономит мне массу времени и строк кода. Однако плавный синтаксис кажется мне более естественным, чем синтаксис выражения запроса.

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

Есть ли разница между ними или есть какое-то преимущество одного перед другим?

Для сложных запросов я считаю синтаксис лямбда более понятным / читаемым, но синтаксис запросов просто красивее.

nawfal 01.08.2015 12:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
258
1
68 963
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

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

Мне очень нравится синтаксис Fluent, и я стараюсь использовать его там, где могу, но в некоторых случаях, например, когда я использую объединения, я обычно предпочитаю синтаксис запросов, в этих случаях мне легче читать, и я думаю, что некоторые люди синтаксис запросов (похожий на SQL) более знаком, чем лямбды.

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

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

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

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

«поскольку это просто методы расширения, вы можете написать свои собственные». - столкнетесь ли вы с этой проблемой? stackoverflow.com/a/3850254/1175496

The Red Pea 20.09.2016 15:46

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

var titlesQuery = from e in entries
                  where e.Approved
                  orderby e.Rating
                  select e.Titles;

var title = titlesQuery.FirstOrDefault();

Как только мне нужно добавить (скобки) и .MethodCalls(), я меняю.

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

var title = entries
    .Where (e => e.Approved)
    .OrderBy (e => e.Rating)
    .Select (e => e.Title)
    .FirstOrDefault();

Я считаю, что это немного легче читать.

Я предпочитаю синтаксис запросов, поскольку я пришел из традиционного веб-программирования с использованием SQL. Мне намного легче обдумать. Тем не менее, я думаю, что начну использовать .Where (лямбда), поскольку он определенно намного короче.

Я вообще не понимаю синтаксиса запроса. По-моему, для этого просто нет причин. let может быть достигнута с .Select и анонимными типами. Я просто думаю, что с «пунктуацией» все выглядит намного организованнее.

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

Roman Starkov 04.05.2010 22:11

@Instance Hunter: То же самое и здесь. Мне потребовалось некоторое время, чтобы понять идею свободного синтаксиса. В сочетании с мощным перечислимым и идеей «чистых» функций теперь мне это очень нравится, и прежде сложные ситуации, не имевшие хорошего представления кода. Для части мозга ye-ole-SQL наличие синтаксиса запросов по-прежнему является благом.

Xan-Kun Clark-Davis 26.02.2017 13:53

Пользуюсь Linq уже около 6 месяцев. Когда я впервые начал его использовать, я предпочел синтаксис запроса, так как он очень похож на T-SQL.

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

Ответ принят как подходящий

Ни то, ни другое не лучше: они служат различным потребностям. Синтаксис запроса приходит на помощь, когда вы хотите использовать несколько переменных диапазона. Это происходит в трех ситуациях:

  • При использовании ключевого слова let
  • Когда у вас несколько генераторов (предложения из)
  • При выполнении присоединяется

Вот пример (из примеров LINQPad):

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

Теперь сравните это с тем же синтаксисом метода:

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

С другой стороны, синтаксис метода предоставляет полный спектр операторов запроса и более краток для простых запросов. Вы можете получить лучшее из обоих миров, смешивая синтаксис запроса и метода. Это часто делается в запросах LINQ to SQL:

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };

Хороший ответ. Не могли бы вы рассказать мне немного больше о том, что делает ".Select (name => new {name, fName})"?

quillbreaker 10.08.2010 16:34

Он выбирает отдельное слово (anne, williams, john и т. д.) Вместе с полным именем анонимным шрифтом. Это позволяет вам «переносить» исходное полное имя, чтобы у вас был доступ как к полному имени, так и к отдельному слову в остальной части запроса.

Joe Albahari 11.08.2010 06:41

Я знаю, что этот вопрос помечен тегом C#, но синтаксис Fluent мучительно многословен с VB.NET.

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

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

Но по большей части это личные предпочтения, за некоторыми исключениями.

Я не буду навязывать личные предпочтения .. Но это я.

Memet Olsen 23.03.2016 12:47

В VB.NET я очень предпочитаю синтаксис запроса.

Ненавижу повторять уродливое ключевое слово Function:

Dim fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
Dim query =
     fullNames.SelectMany(Function(fName) fName.Split().
     Select(Function(Name) New With {Name, fName})).
     OrderBy(Function(x) x.fName).
     ThenBy(Function(x) x.Name).
     Select(Function(x) x.Name & " came from " & x.fName)

На мой взгляд, этот аккуратный запрос более читабелен и удобен в обслуживании:

query = From fullName In fullNames
        From name In fullName.Split()
        Order By fullName, name
        Select name & " came from " & fullName

Синтаксис запросов VB.NET также более мощный и менее подробный, чем в C#: https://stackoverflow.com/a/6515130/284240

Например, этот запрос LINQ to DataSet (Objects)

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

C#:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

Мои соболезнования тем разработчикам VB, которые не могут использовать стиль запросов.

nawfal 06.03.2014 21:14

Ваш последний пример C# слишком упрощен, чтобы быть ценным: вы просто напишите `dataTable1.AsEnumerable (). Take (10);

Emyr 18.11.2016 13:15

@Emyr: мой последний абзац, который начинается со слов «синтаксис запроса VB.NET также более мощный и менее подробный, чем в C#», просто сравнивает синтаксис запроса VB.NET с C#, вы используете синтаксис метода.

Tim Schmelter 18.11.2016 13:22

Другие вопросы по теме