Запросить поле JSON, используя переменную path, используя FromSql и интерполяцию? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть таблица, содержащая несколько обычных столбцов, и один столбец 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.

Есть ли способ выполнить то, что я спрашиваю?

...