Подтвердить что ты не робот

Плюсы и минусы LINQ (языковой интеграции)

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

Ответ 1

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

Плюсы:

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

Минусы:

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

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

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

Ответ 2

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

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

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

Ответ 3

Существует проблема с ними из-за скрытых исключений из блоков catch 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.

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

Ответ 4

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

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

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

Ответ 5

Pro:

Con:

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

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