我正在研究一个小型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.
答案 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);
}