Итак, у меня есть конечная точка поиска
[HttpGet("search")]
public async Task<IActionResult> Search([FromQuery] string query)
который возвращает список пользователей из CosmosDb на основе электронной почты, имени и т. д.
Проблема в том, что я не знаю, как преобразовать строку запроса в SQL-запрос или инструкцию LINQ. Я часами гуглил, но не могу найти ни одного примера, но это кажется странным, если мне нужно написать свой собственный парсер запросов?
Я представляю что-то вроде /users/search?query=firstname%DLucy&lastname%DJohnson
в противном случае вы можете использовать контроллер odata для обработки сложного запроса без необходимости самостоятельно переводить строку запроса.
Учитывая пример значения query
в вашем комментарии, я думаю, вы на самом деле имеете в виду что-то вроде /users/search?query=firstname%3DLucy%26lastname%3DJohnson
(обратите внимание на %3D
вместо %D
и %26
вместо &
). Расшифрованное значение этого будет firstname=Lucy&lastname=Johnson
. В этом случае у вас будет своего рода строка запроса внутри значения параметра query
вашей строки запроса.
Одним из решений было бы избавиться от параметра query
и просто использовать параметры вашего фактического запроса в качестве обычных параметров строки запроса.
Например:
// URL with query string:
// /users/search?firstName=Lucy&lastname=Johnson
// Matching controller method
[HttpGet("search")]
public async Task<IActionResult> Search(
[FromQuery] string firstName = null,
[FromQuery] string lastName = null)
{
// use the firstName and lastName variables to put together some
// SQL as a string or include them in some linq
}
С решением, описанным выше, вам не нужно ничего анализировать, так как значения вашего запроса будут автоматически проанализированы asp.net. Однако вам придется составить запрос к базе данных самостоятельно.
Если вы хотите придерживаться исходного дизайна и иметь один-единственный параметр query
, который сам является строкой запроса, вы можете сделать следующее:
// URL with query string:
// https://localhost:5000/search?query%3DLucy&26lastname%3DJohnson
// Matching controller method
[HttpGet("search")]
public async Task<IActionResult> Search(
[FromQuery] string query)
{
var parsed = HttpUtility.ParseQueryString(query);
// ...or, depending on what version of .NET you're using:
// var parsed = QueryHelpers.ParseQuery(query);
var firstName = parsed["firstName"];
var lastName = parsed["lastName"];
// use the firstName and lastName variables to put together some
// SQL as a string or include them in some linq
}
Значит, нельзя избежать создания пользовательской конечной точки поиска для каждого запроса? Если пользователь хочет фильтровать по электронной почте, например
Для каждого запроса не требуется отдельная конечная точка поиска. Вы просто добавите адрес электронной почты в качестве еще одного параметра метода Search()
, как firstName
и lastName
. Все эти параметры являются строками, допускающими значение NULL, что означает, что они необязательны в строке запроса.
Можете ли вы привести пример того, что передается как значение для
query
? Это просто поисковый запрос (например, «sam») или реальный запрос (например,SELECT * FROM ...
)?