У меня есть таблица, содержащая несколько обычных столбцов, и один столбец Custom
, содержащий строку JSON.Поле может содержать произвольный JSON, который добавляется пользователем (возможно, некоторые настраиваемые поля, которые он хотел бы сохранить для контакта).
Я хотел бы иметь возможность запросить таблицу, передав name
и value
и проверка, содержит ли столбец JSON свойство name
, значение которого равно value
.Например, name="hometown"
и value="Toronto"
Это не удается
public IActionResult GetCustom([FromQuery] string name, [FromQuery]string value)
{
var results = dbContext.Contacts
.FromSql<Contact>($"SELECT * from Contacts WHERE JSON_VALUE(Custom, '$.{name}') = '{value}'")
.ToList();
return Ok(results);
}
Это «параметризует» входные значения для защиты от внедрения SQL, но это не удастся с этимошибка:
Произошло исключение: CLR / System.Data.SqlClient.SqlException Исключение типа 'System.Data.SqlClient.SqlException' произошло в Microsoft.EntityFrameworkCore.dll, но не было обработано пользователемкод: 'Путь JSON не отформатирован должным образом.Неожиданный символ '@' находится в позиции 2.
Кажется, что JSON_VALUE не понимает параметризованное значение.
Это успешно
Если япередать его как отформатированную строку, тогда запрос работает нормально, но .NET жалуется, что это небезопасно.
var queryString = $"SELECT * from Contacts WHERE JSON_VALUE(Custom, '$.{name}') = '{value}'";
dbContext.Contacts
.FromSql<Contact>(queryString)
.ToList();
Но .NET будет жаловаться, что это небезопасно из-за возможности внедрения SQL.
Есть ли способ выполнить то, что я спрашиваю?