Я не говорю, что это идеальное решение или даже отличный пример (это было результатом ограничения высокого уровня архитектуры, а не того, что мы обязательно выбрали бы с нуля), но ...
Я работал над приложением, в котором код был полностью изолирован от базы данных, кроме как через набор открытых хранимых процедур. Код не мог «знать» ничего о схеме базы данных, кроме как был возвращен из сохраненных процедур.
Хотя это не так уж и необычно и не составляет особого труда написать DAL с использованием ADO или чего-либо еще, я решил попробовать Linq для Sql, даже если он не будет использовать его по прямому назначению и не будет использовать большинство функций. Оказывается, это было отличное решение.
Я создал класс Linq to Sql, перетащил сохраненные процессы из обозревателя серверов в правую часть конструктора, а затем ... Подождите, тогда их нет. Я был почти готов.
Linq создал строго типизированные методы для каждого хранимого процесса. Для процедур, которые возвращали строки данных, Linq автоматически создал класс для элементов в каждой строке и возвратил для них List<generatedClass>
. Я обернул вызовы в легкий общедоступный класс DAL, который провел некоторую проверку и некоторую автоматическую настройку параметров, и все было готово. Я написал класс бизнес-объекта и отобразил динамически сгенерированные объекты класса Linq в бизнес-объект (сделал это вручную, но это не сложно сделать или поддерживать).
Программа теперь защищена от любых изменений схемы, которые не влияют на сигнатуры хранимых процедур. Если подписи меняются, мы просто перетаскиваем старый процесс из дизайна и перетаскиваем его обратно, чтобы восстановить код. Несколько проходов через модульные тесты для внесения изменений (которые обычно не идут выше, чем общедоступный интерфейс DAL), и все готово. Вещи до DAL используют методы Linq to Objects для выбора, фильтрации и сортировки данных, которые не в нужном формате, прямо из хранимых вызовов proc.
У нас есть несколько превосходных администраторов баз данных, которые пишут хранимые процедуры, и совершенно другая группа, пишущая другой код, так что, возможно, это хороший пример того, почему (и как) вы можете использовать LINQ в описываемом вами сценарии.