Синтаксис методов расширения и синтаксис запросов



Я пытаюсь разобраться, есть ли подходящее время для использования стандартных ключевых слов linq или методов расширения linq с лямбда-выражениями. Они, кажется, делают то же самое, просто написаны по-разному. Это чисто вопрос стиля?



var query = from p in Products
where p.Name.Contains("foo")
orderby c.Name
select p;

// or with extension methods:
var query = Products
.Where(p => p.Name.Contains("foo"))
.OrderBy(p => p.Name);


они очень похожи со вторым примером, который немного более лаконичен, но, возможно, менее выразителен, если вы не знаете, что делает=>.



кроме написания краткого кода, есть ли другие преимущества в использовании методы расширения в отличие от синтаксиса LINQ?

572   7  

7 ответов:

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

  Func<DataClasses.User, String> userName = user => user.UserName;
  Func<DataClasses.User, Boolean> userIDOverTen = user => user.UserID < 10;
  Func<DataClasses.User, Boolean> userIDUnderTen = user => user.UserID > 10;

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

Примечание: это глупый пример, но это завод.

  var userList = 
    from user in userList
    where userIDOverTen(user)
    select userName;

и

  var otherList =
    userList
    .Where(IDIsBelowNumber)
    .Select(userName)

в этом примере второй немного менее подробный, так как метод расширения может полностью использовать Func, но он не может использовать выражение Linq, поскольку он ищет только логическое, а не Func, которое возвращает boolean. Однако, это может быть лучше использовать язык выражений. Скажем, у вас уже был метод, который принимает больше, чем просто пользователь:

  private Boolean IDIsBelowNumber(DataClasses.User user, 
          Int32 someNumber, Boolean doSomething)
  {
    return user.UserID < someNumber;
  }

Примечание: doSomething как раз там из-за метод расширения where в порядке с методом, который принимает пользователя и целое число и возвращает логическое значение. Вид раздражает для этого примера.

теперь, если вы посмотрите на запрос LINQ:

  var completeList =
     from user in userList
     where IDIsBelowNumber(user, 10, true)
     select userName;

Вы хороши для него. Теперь метод расширения:

  var otherList =
    userList
    .Where(IDIsBelowNumber????)
    .Select(userName)

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

   private Func<DataClasses.User, Boolean> IDIsBelowNumberFunc(Int32 number)
   {
      return user => IDIsBelowNumber(user, number, true);
   }

и затем подключите это здесь:

  var otherList =
     userList
     .Where(IDIsBelowNumberFunc(10))
     .Select(userName)

так что вы можете видеть, иногда это может быть просто проще использовать подход запроса в разы.

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

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

пример

Я использую специальный метод расширения под названием Into который просто берет строка:

пример с запросом

var query = (from p in Products
    where p.Name.Contains("foo")
    orderby c.Name
    select p).Into("MyTable");

пример с методами расширения

var query = Products
                   .Where(p => p.Name.Contains("foo"))
                   .OrderBy(p => p.Name)
                   .Into("MyTable");

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

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

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

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

просто мое центы.

поскольку я пока не могу комментировать, я хочу сделать один здесь ответ инструмента программирования: Зачем создавать совершенно новый метод для последнего примера?? Вы не можете просто использовать:

.Where(user => IDIsBelowNumber(user, 10, true))

Они собрать то же самое, и эквивалентны. Лично я предпочитаю методы lambda (extension) для большинства вещей, используя только операторы (standard), если я делаю LINQ to SQL или иным образом пытаюсь эмулировать SQL. Я считаю, что лямбда-методы лучше работают с кодом, тогда как операторы визуально отвлекают.

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

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

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

var query = from p in Products
            where p.Name.Contains("foo")
            orderby p.Name
            select p;

var result = query.ToList(); //extension method syntax

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

var nonQuery = Products.Where(p => p.Name.Contains("foo"))
                       .OrderBy(p => p.Name)
                       .ToList();

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

одним из преимуществ методов расширения / выражений lynda являются дополнительные операторы, которые предлагаются как Skip и Take. Например, если вы создаете метод разбиения на страницы, возможность пропустить первые 10 записей и взять следующие 10 легко реализовать.

Comments

    Ничего не найдено.