Я работаю над небольшим веб-API, который будет использовать SqlKata в качестве внутреннего обработчика запросов для взаимодействия с SQL Server. В документации SqlKata говорит следующее относительно нескольких предложений where:
Несколько полей
Если вы хотите отфильтровать запрос по нескольким полям, передайте объект, представляющий столбцы / значения.
var query = new Query("Posts").Where(new {
Year = 2017 ,
CategoryId = 198 ,
IsPublished = true,
});
Мое намерение состоит в том, чтобы использовать строки запроса для создания предложений WHERE на серверной части, но я немного застрял в том, как преобразовать пары ключ / значение строк запроса в свойства объекта, который будет использоваться в Запрос SqlKata. Запрос будет очень динамичным по своей природе, поэтому я не могу использовать статический объект. Мне интересно, есть ли у кого-нибудь советы о том, как сконструировать объект для удовлетворения этих требований, поскольку свойства - как имя свойства, так и / или значение - могут быть динамическими, как и число свойств в объекте. В моей голове я мог представить, как каким-то образом преобразовать пары ключ / значение строк запроса в объект во время выполнения, но я застрял на том, как этого добиться.
Я попробовал следующее, но, похоже, на каждой итерации в цикле заменяется последняя пара ключ / значение, так что в итоге вы получаете только самое последнее рассматриваемое предложение WHERE:
if (request.QueryStringParameters != null)
{
foreach (var element in request.QueryStringParameters)
{
CreateCloudWatchLog($"query string {element.Key} value {element.Value}", context, LogLevel.Trace, environmentLogLevel);
if (element.Key != "limit")
{
query = query.Where(element.Key, element.Value);
}
if (element.Key == "limit")
{
query = query.Limit(Convert.ToInt32(element.Value));
}
}
}
Я также пробовал этот подход (строки запроса => json => динамический объект), но я получаю сообщение об ошибке «несоответствие количества параметров» (я тестирую с одним переданным параметром в «Storenumber» со значением 399)
var json = JsonConvert.SerializeObject(request.QueryStringParameters, Formatting.Indented);
CreateCloudWatchLog($"Serialised query strings = {json}", context, LogLevel.Trace, environmentLogLevel);
var myobject = JsonConvert.DeserializeObject<dynamic>(json);
query = query.Where(myobject);
Журналы отладки:
[Trace] Serialised query strings =
{
"storenumber": "399"
}
[Trace] Finished converting JSON to object
[Error] Parameter count mismatch.