LINQ - Свободное выражение и выражение запроса. Есть ли какие-либо выгоды от других?

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();

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

Ответ 1

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

  • При использовании ключевого слова 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 };

Ответ 2

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

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();

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

Ответ 3

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

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

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

Ответ 4

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

Мне не нравится повторять уродливое Function -keyword:

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 также более мощный и менее подробный, чем в С#: fooobar.com/questions/28949/...

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

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

С#:

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

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