Единственными системами, которые должны передавать SQL между слоями , являются инструменты SQL по своей сути (например, SEDE ).
Во всех других случаях вы почти наверняка должны передать некоторое DTO между слоями, представляющими доступные параметры поиска, например,
public HttpResponseMessage RiskGridView(string reference = null, string policyGroup = null, ... )
или через json с:
class SearchRequest {
public string Reference {get;set;}
public string PolicyGroup {get;set;}
// ...
}
public HttpResponseMessage RiskGridView(SearchRequest query)
Теперь метод RiskGridView
создаст требуемый SQL, используя параметры (не конкатенация).Вызывающая система не должна знать структуру таблицы .
. Я бы также настоятельно рекомендовал инструменты, такие как "Dapper", для фактического ее исполнения после того, как она была сконструирована:
...
if(opt.Reference != null) sql.Append(" and x.Reference=@Reference");
if(opt.PolicyGroup != null) sql.Append(" and x.PolicyGroup=@PolicyGroup");
//...
var results = connection.Query<RiskSearch>(sql.ToString(), opt); // handles params/reader
или используйте такой инструмент, как LINQ:
IQueryable<RiskSearch> rows = ctx.RiskSearch;
if(opt.Reference != null) rows = rows.Where(x => x.Reference == opt.Reference);
if(opt.PolicyGroup != null) rows.Where(x => x.PolicyGroup == opt.PolicyGroup);
// ...
var results = rows.Take(count).ToList();