Ответ 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 и т.д. действительно хороши там, где они уместны, но их труднее понять и нуждаться в большем опыте. Они также применимы только в определенных областях вашего кода.