【问题标题】:Convert Dictionary to anonymous object in c#?在c#中将字典转换为匿名对象?
【发布时间】:2019-05-28 07:11:34
【问题描述】:

我有一个使用 C# 构建的 Web API。此 Web API 用作查询 SQL 数据库的前端。我使用 SqlKata 作为引擎来执行查询。生成 WHERE 子句时,SqlKata 文档说明如下:

多个字段

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

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

我希望能够避免硬编码 WHERE 子句,而是基于传入的查询字符串。我的想法是将每个查询字符串名称和值添加到字典中,然后以某种方式在 SqlKata .Where() 子句中使用该字典的值。我想也许我可以将 Dictionary 转换为所需的匿名对象,但我无法让它工作。任何想法的人如何做到这一点?所以我的网址可能是:

https://webapi.com.au/api?store=120&name=james

字典: 商店=120 名字=詹姆斯

查询: var query = new query("Posts").Where(anonObject)

( anonObject 将是 {store=120,name=james} )

【问题讨论】:

  • 如果您试图“避免硬编码 WHERE 子句”,您不只是将硬编码转移到字典中吗?
  • 否,因为字典将由用户添加到 Web API 的 URL 的查询字符串驱动。这个想法是,用户可以添加与表中的列相对应的查询字符串值的任意组合。那将被转换成字典,然后转换成匿名对象。如此有效,通过使用像 store=120&user=james 这样的查询字符串条目,这最终会变成 WHERE store = 120 AND user = james。但也可以很容易地只是 store=120,这将导致只有 WHERE store = 120。字典不是硬编码的,它是基于查询字符串的动态
  • 为什么不只对查询字符串值进行循环并通过连续的 .Where("column", "value") 调用来构建您的查询?或者扩展查询以支持获取 IDictionary 如果它还没有?
  • 这非常危险,SQL Injection 攻击的可能性很高。

标签: c# .net dictionary anonymous-types sqlkata


【解决方案1】:

您不需要匿名对象。查看 SqlKata 文档,您可以通过遍历字典来构建查询,如下所示:

//Assuming the dictionary is something like Dictionary<string, object>

var query = new Query("Posts");

foreach(var element in dictionary)
{
    query = query.Where(element.Key, element.Value);
}

var result = query.Get();

注意:以前从未听说过 SqlKata,所以这只是通过查看文档。

【讨论】:

  • 感谢 DavidG,看起来它可以解决问题。我猜你的笔记是为了证明我没有正确审查文档,但我会说这是一个诚实的错误——我真的错过了那个特定的部分。感谢您的指出,我会试一试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2018-07-15
  • 2011-11-27
  • 1970-01-01
  • 2017-12-04
  • 2018-06-12
相关资源
最近更新 更多