Множественное предложение where с использованием механизма запросов C # и SqlKata - PullRequest
0 голосов
/ 25 января 2019

Я работаю над небольшим веб-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.

1 Ответ

0 голосов
/ 25 января 2019

Глядя на документацию, похоже, что вы можете использовать basic, где метод, который принимает свойство и значение. Например, если у вас есть словарь пар ключ-значение, вы можете сделать это:

var filters = new Dictionary<string, object>
{
    { "Year", 2017 },
    { "CategoryId", 198 },
    { "IsPublished", true },
}

var query = new Query("Posts");

foreach(var filter in filters)
{
    query = query.Where(filter.Key, filter.Value);
}
...