使用 C# 和 SqlKata 查询引擎的多个 where 子句

Multiple where clause using C# and SqlKata query engine

我正在开发一个小型 Web API,它将在后端使用 SqlKata 作为查询引擎来与 SQL 服务器通信。在文档中,SqlKata 就多个 where 子句说了以下内容:

多个字段 如果您想针对多个字段过滤查询,请传递一个表示 col/values.

的对象
var query = new Query("Posts").Where(new {
    Year = 2017 ,
    CategoryId = 198 ,
    IsPublished = true,
});

我的意图是使用查询字符串在后端创建 WHERE 子句,但我对如何将 Key/Value 对查询字符串转换为对象的属性有点困惑在 SqlKata 查询中使用。该请求本质上是高度动态的,所以我不能真正使用静态对象。我想知道是否有人对如何构造一个对象来满足这些要求有任何提示,因为属性 - 属性 名称 and/or 值 - 可以是动态的,其中的属性数量也可以物体。在我的脑海中,我可以想象以某种方式在 运行 时间将查询字符串的键/值对转换为一个对象,但我仍然不知道如何实现它。

我确实尝试了以下方法,但似乎循环中的每次迭代都替换了最后一个 key/value 对,因此您最终只考虑了最近的 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 => 动态对象)但我收到错误 'parameter count mismatch'(我正在测试一个名为 [=31= 的传入参数] 值为 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.

查看文档,您似乎可以使用带有 属性 和值的 basic where 方法。例如,假设你有一个键值对字典,你可以这样做:

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);
}