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

时间:2019-01-25 00:53:53

标签: c# rest api-gateway sqlkata

我正在研究一个小型Web API,它将在后端使用SqlKata作为与SQL Server进行通信的查询引擎。在文档中,SqlKata针对多个where子句说了以下内容:

多个字段 如果要针对多个字段过滤查询,请传递一个代表col / values的对象。

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)< / p>

                        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 :(得分:0)

查看文档,您似乎可以使用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);
}