2

我正在开发一个小型 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)

                        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.
4

1 回答 1

1

查看文档,您似乎可以使用带有属性和值的基本 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);
}
于 2019-01-25T01:01:29.740 回答