Плюсы и минусы LINQ (Language-Integrated Query)

  • Каковы плюсы и минусы LINQ (Language-Integrated Query)?
  • Каковы лучшие и худшие случаи использования LINQ?
  • Какую пользу вы получили от использования LINQ?
  • Какие источники данных извлекают наибольшую и наименьшую пользу из LINQ?

Похоже, хороший кандидат на вопрос сообщества Wiki

Jay Bazuzi 07.11.2008 09:42
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
1
17 573
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

Плюсы:

  • Декларативный подход упрощает понимание запросов и делает их более компактными.
  • Расширяемость и деревья выражений позволяют в основном согласовывать запросы из нескольких источников.
  • Даже внутрипроцессные запросы могут быть реализованы способами, отличными от LINQ to Objects, например Параллельный LINQ и моя собственная структура Push LINQ. Очень гибкий.
  • Сказочно полезен для запросов внутри процесса, где его легче всего понять
  • Замечательно иметь возможность избежать SQL в строках и т. д.
  • Широкий спектр операторов, предоставляемых по умолчанию, и другие могут быть легко добавлены для LINQ to Objects.
  • Языковые функции, представленные в основном для LINQ, широко применяются в других местах (ура для лямбда-выражений)

Минусы:

  • Выражения запросов недостаточно хорошо понимаются и используются чрезмерно. Часто вызов простого метода короче и проще.
  • Неизбежные несоответствия между провайдером - несоответствие импеданса все еще присутствует, что разумно, но необходимо понимать
  • Всегда есть что-то, что можно делать в SQL, но не в LINQ.
  • Не понимая, что происходит, легко написать очень неэффективный код.
  • Трудно написать поставщика LINQ. Это вполне может быть неизбежно, но хотелось бы получить больше рекомендаций от Microsoft.
  • Это новый способ мышления о доступе к данным для большинства разработчиков, и для его понимания потребуется время.
  • Не конкретно LINQ, но связанный с ним - способ обнаружения методов расширения в C# недостаточно детализирован
  • Некоторые операторы «отсутствуют», особенно эквиваленты OrderBy для других вещей, кроме заказа, например поиск предмета с максимальной стоимостью свойства
  • Отсроченное выполнение и потоковая передача плохо изучены (но улучшаются)
  • Отладка может быть очень сложной из-за отложенного выполнения и потоковой передачи.
  • В некоторых конкретных случаях LINQ может быть значительно медленнее, чем код вручную. Чем лучше вы понимаете внутреннюю работу, тем лучше вы сможете это предсказать. (И, конечно же, если для вас важна производительность, у вас должны быть соответствующие тесты.)

Я считаю, что это лучше всего при работе с запросами внутри процесса. Их легко предсказать, понять и расширить. Дополнительные технологии, такие как LINQ to XML и Parallel LINQ, великолепны. LINQ to Objects можно использовать практически где угодно.

LINQ to SQL и т. д. Действительно хороши там, где они подходят, но их сложнее понять и им нужно больше опыта. Они также применимы только в определенных областях вашего кода.

плотина, у нее много минусов, но мне она все еще нравится

Nathan W 07.11.2008 10:09

Они должны переименовать сайт в Skeetoverflow IMO.

cfeduke 07.11.2008 10:20

@Nathan: Да, список минусов пугает, но плюсы гораздо важнее :) Я все время скучаю по LINQ, когда пишу на Java :(

Jon Skeet 07.11.2008 10:30

Разве чуть меньше половины списка мошенников - это вина разработчиков, а не самого LINQ?

John Farrell 17.12.2008 17:52

@jfar: Возможно, но они все еще «минусы».

Jon Skeet 17.12.2008 18:13

@jfar: поскольку легкость чтения и легкость в использовании - это плюсы языков, то легкость в понимании и легкость создания ошибки должны быть минусами :)

Quan Mai 04.08.2010 10:25

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

Steve Hibbert 25.04.2017 13:00

@SteveHibbert: Такое заявление одеяло о производительности просто требует дополнительных подробностей. В очень, очень многих случаях разница будет совершенно незначительной, независимо от размера набора данных. (Из вашего комментария даже не ясно, говорите ли вы о LINQ to Objects или о LINQ вне процесса, для начала ...)

Jon Skeet 25.04.2017 13:02

Извинения, я не хотел скрывать порочность LINQ, я много использую Linq to XML и Linq с коллекциями, Count (), First () и т. д., Все в порядке. Мой опыт в основном связан с LinqToObjects. Пример, Except () для словарей с 1 миллионом записей был в шесть раз медленнее, чем итерация [stackoverflow.com/questions/8851155/…. Это может не иметь значения в 99% случаев, но люди должны знать о потенциальных потерях производительности с Linq to Objects.

Steve Hibbert 25.04.2017 16:26

@SteveHibbert: Да, конечно, будут случаи особый, когда это произойдет. Но я бы сказал, что это скорее исключение, чем норма. Добавлю что-нибудь подходящее с оговоркой в ​​минусы.

Jon Skeet 25.04.2017 16:40

Моя любимая часть: их использование для упрощения написания модульных тестов. Также цепочки IEnumerable побудили меня писать более плавные интерфейсы в моем коде.

Минусы: лямбды и методы расширения - мои молотки, а все проблемы - гвозди.

В целом: вдохнул новую жизнь в программирование на C# для меня.

Это очень красноречивые заявления. Согласен на 100%.

Jon Skeet 07.11.2008 10:31

У них есть проблема скрытого исключения исключений из блоков try catch посредством отложенного выполнения.

Например:

var l = new List<int>() {1, 2, 3};
try
{
    l.Select(x => x / 0);
}
catch
{
    // error
}

l.elementAt(0); // exception occurs here outside of the try catch

Что может быть непросто в первый раз, когда вы столкнетесь с этим, особенно когда отладчик укажет вам на код внутри try-catch.

В остальном я считаю их невероятно полезными и очень экономящими время.

Написанный пример будет работать нормально. Как вы сказали, LINQ может быть хитрым, но не в том смысле, который вы подразумевали :) Вызов Select ничего не сделает - он вернет IEnumerable, который необходимо повторить, чтобы получить какой-то результат. Таким образом, исключение не возникает, это нормально и по дизайну, плюс коллекция никоим образом не будет изменена. Следовательно, последний вызов вернет 1.

rawpower 29.11.2010 18:45

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

Некоторое время назад я пробовал использовать LINQ to SQL, но обнаружил, что он недостаточно мощный и неуклюжий. В частности, я не мог заставить себя использовать конструктор классов базы данных SQL. Может быть, он дает intellisense в базе данных, но кому он нужен, когда у вас есть SQL?

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

Pro:

Против:

  • Как и любую новую технологию, слишком многие люди ее не понимают, но все равно используют.

@Jon Skeet - еще один отличный ответ, вы крадете гром: P. Я полностью согласен с тем, насколько сложно писать провайдера, я в процессе написания! Вы знакомы с Барт Де Смет? У него есть много хороших примеров этого.

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