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

Где положить sql при использовании dapper?

Я использую dapper для проекта mvc3 на работе, и мне это нравится. Однако как вы должны сложить приложение при использовании dapper? В настоящее время у меня есть все мои sql, набитые непосредственно в контроллере (slap), но я думал о создании класса со статическими строками. Поэтому я мог сделать

var reports = Dapper.Query<Report>(conn, MySql.ReportsRunningQuery)

Как вы храните свой sql при использовании dapper?

4b9b3361

Ответ 1

Я бы сказал, поставьте sql, где вы бы поставили эквивалентный запрос LINQ или sql для DataContext.ExecuteQuery. Что касается того, где это... ну, это зависит от вас и зависит от того, сколько вы хотите разделить.

Однако лично я не вижу никакой выгоды, скрывающей SQL в отдельном классе от вызова Query<T> - вы хотите увидеть их в контексте, чтобы вы могли легко проверить данные (и действительно, параметры). Вы также можете построить запрос (все еще параметризованный) на месте. Но для регулярного статического запроса я бы сохранил TSQL как литерал рядом с кодом, если у меня нет веской причины, чтобы он был абстрагирован, т.е.

var reports = conn.Query<Report>(@"
select x.blah, y.blah
from x (snip)
where x.ParentId = @parentId and y.Region = @region", new {parentId, region});

(обратите внимание также на использование альтернативного метода расширения выше)

IMO, ключ в вышеизложенном состоит в том, что крайне редко вам придется повторно использовать этот запрос из любого другого места - вместо этого логика будет помещена в метод, и этот метод вызывается из нескольких мест. Поэтому единственной причиной, по которой вы можете скрыть запрос за центральной оболочкой, является необходимость поддержки разных поставщиков баз данных (с разными диалектами SQL). И это реже, чем люди видят.

Ответ 2

Использование файла ресурсов действительно полезно для нас. Мы создаем файлы .sql в вызове папки /Sql и перетаскиваем их в раздел "Файлы" нашего объекта SqlResource. Раздел "Строки" файла ресурсов действительно чист и прост для небольших фрагментов sql (например, функций, которые мы можем запрашивать).

Итак, наш sql выглядит так:

var reports = conn.Query<Report>(SqlResource.Blahs_get, new {parentId, region});

Это сохраняет репозитории в чистоте. И есть дополнительные преимущества, связанные с тем, что все ваши sql файлы в файле ресурсов вы можете перебирать записи и потенциально запрашивать db с PARSEONLY, чтобы убедиться, что если объекты db изменят ваши запросы, они будут разбиты (обратите внимание, что это в основном, но не 100% надежный).

Итак, в заключение, для нас файлы ресурсов сохраняют чистоту, но для Марка Гравелла они не предназначены для повторного использования в производственном коде... каждый оператор sql должен использоваться только одной точкой вашего приложения.

Ответ 3

Несмотря на то, что этот вопрос сейчас значительно устарел, я хотел бы дополнительно предложить внешнее хранилище SQL. Visual Studio (не менее 2015+) имеет подсветку синтаксиса, а также небольшой отладчик и диспетчер соединений для файлов *.sql. Кроме того, файлы можно пометить как Embedded Resource и полностью содержаться в сборке, но отдельно от вашего кода. Вы будете расти, чтобы ненавидеть видеть бесцветный SQL, встроенный в строки, не подтвержденные синтаксисом.

Я применил этот шаблон во всех моих последних проектах и ​​в сочетании с ORM, например Dapper, взаимодействие между С# и SQL становится очень минимальным. У меня есть проект с открытым исходным кодом, расширяющий Dapper, доступный на GitHub, который может предоставить примеры, а также Пакет NuGet. Он также включает в себя движок замены строки с усами, который полезен для шаблонов ваших сценариев, чтобы сделать их повторно используемыми или вставлять условия динамической фильтрации.