Я бы сказал поместить 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). И это реже, чем люди понимают.