В конечном счете, Даппер не может помочь ни с чем, что происходит за пределами фактического шага параметризации;если вы введете дыры для SQL-инъекций до того, как передаст их Dapper: да, у вас будут дыры для SQL-инъекций.
Однако вы все равно можете использовать Dapper с нетривиальными запросами;и вы все еще можете параметризовать.Например, вы можете сделать:
int? userId = /* something, could be null */
string region = /* something, could be null */
var sql = new StringBuilder(@"select ... /* whatever */ where Open = 1");
if (userId != null) sql.Append(" and UserId = @userId");
if (region != null) sql.Append(" and Region = @region");
// ... etc
var data = conn.Query<SomeType>(sql.ToString(), new { userId, region }).AsList();
Здесь Dapper будет добавлять только те параметры, которые он на самом деле видит, используемые в запросе;поэтому, если @userId
не появляется, он не добавляет этот параметр.Но самое важное: запрос по-прежнему полностью параметризован и не имеет дыр в SQL-инъекциях.
В более сложных сценариях Dapper также поддерживает словарные параметры, для которых необходимо добавлять параметры по запросу, а не статически.