- Каковы преимущества и недостатки LINQ (Language-Integrated Query)?
- Каковы наилучшие и худшие случаи использования LINQ?
- Как вы выиграли или не получили пользу от использования LINQ?
- Какие источники данных выигрывают от наименьшего и максимального из LINQ?
Плюсы и минусы LINQ (языковой интеграции)
Ответ 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:
- LINQ to SQL позволяет использовать RAD с базой данных
- Легко запросить несколько источников данных
- LINQ to SharePoint, LINQ to Active Directory, LINQ to TFS, LINQ to Umbraco, (и список можно продолжить)
Con:
- Как и любая новая технология, слишком много людей не понимают ее, но все еще используют ее
@Jon Skeet - еще один отличный ответ, вы крадете каждый гром: P. Я полностью согласен с тем, насколько сложно писать провайдер, я сейчас в процессе этого! Вы знакомы с Bart De Smet? У него много хороших примеров.