Я бы сказал поместите 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});
(обратите внимание на использование альтернативного метода расширения выше)
ИМО, суть вышеизложенного в том, что крайне маловероятно, что вы когда-либо будете повторно использовать этот запрос из любого другого места — логика вместо этого будет помещен в метод, и этот метод будет вызываться из нескольких мест. Таким образом, единственная другая причина, по которой вы можете скрыть запрос за центральной оболочкой, заключается в том, что вам нужно поддерживать разных поставщиков баз данных (с разными диалектами SQL). И это реже, чем люди разбирают.
person
Marc Gravell
schedule
13.05.2011