【问题标题】:Dynamically build a SQL WHERE clause from c# Objects [closed]从 c# 对象动态构建 SQL WHERE 子句 [关闭]
【发布时间】:2016-12-13 21:38:19
【问题描述】:

我正在使用 HTTP POST 请求与 asp.net Web API 绑定的 HTML 表中创建过滤器,并使用此 jquery querybuilder 创建过滤器。

{
 "condition": "AND",
 "rules": [
   {
     "id": "price",
     "field": "price",
     "type": "double",
     "input": "text",
     "operator": "less",
     "value": "10.25"
   },
   {
     "condition": "OR",
     "rules": [
       {
         "id": "category",
         "field": "category",
         "type": "integer",
         "input": "select",
         "operator": "equal",
         "value": "2"
       },
       {
         "id": "category",
         "field": "category",
         "type": "integer",
         "input": "select",
         "operator": "equal",
         "value": "1"
       }]
   }]
}

有什么方法可以使用 C# 或任何其他可以接收 HTTP post 对象并在 SQL 中过滤数据的 nuget 包在条件下转换此 JSON 对象?

C#

public Products GetProductById(object filterObj)  
 {  
     SqlDataReader reader = null;  
     SqlConnection myConnection = new SqlConnection();  
     myConnection.ConnectionString = @"Server=.\SQLSERVER2008R2;Database=DBCompany;User ID=sa;Password=xyz@1234;";  

     SqlCommand sqlCmd = new SqlCommand();  
     sqlCmd.CommandType = CommandType.Text;  
     sqlCmd.CommandText = "SELECT * FROM MYTABLE WHERE PRICE < 10.25 AND (CATEGORY = 2 OR CATEGORY = 1);  
     sqlCmd.Connection = myConnection;  
     myConnection.Open();  
     reader = sqlCmd.ExecuteReader();  
     Products prod = null;  
     while (reader.Read())  
     {  
         prod = new Products ();  
         prod.Id = Convert.ToInt32(reader.GetValue(0));  
         prod.Name = reader.GetValue(1).ToString();  
         prod.CategoryId = Convert.ToInt32(reader.GetValue(2));  
     }  
     return prod ;  

 }  

【问题讨论】:

  • 所有数据都在那里,所以是的,您可以将其转换为 SQL 查询。如果你想用 c# 来做,你可以创建自己的方法来为你解码。
  • 你在使用mvc web api吗?
  • 是的,我在后端使用带有 SQL 服务器的 mvc web api

标签: c# jquery sql asp.net


【解决方案1】:

您可以使用动态Linq Query Builder

一些例子:我们从 jquery querybuilder 传递规则,而不是构建查询并从数据库中检索相关数据

    [HttpPost]
    public ActionResult Applay(FilterRule obj)
    {
        var messages = context.messages.BuildQuery(obj).ToList();
        return JsonContent(messages);
    }

更新:

obj 已经是带有过滤规则的反序列化 json(来自 jquery querybuilder) context.messages - 是实体框架上下文的一部分

(DbSet<Message> Messages { get; set; })

在这种方法中,您通过 linq 构建 sql 查询,EF 将其转换为 SQL。如果您使用的是 ADO.NET,则可以尝试在 git hib 项目页面上找到相关示例。

【讨论】:

  • SQL server 的任何工作示例?
  • 在我的示例中,我使用的是实体框架和 MS SQL
  • 您能否分享更多细节,SQL命令在哪里,obj包含什么等?
  • 请查看更新后的问题,这就是我从 SQL 中提取数据的方式。现在的问题是如何在我的场景中实施这个解决方案?
  • 嗨 @Ilya,我正在阅读您的评论并试图理解,您能否分享一个 sn-p/链接或添加一些信息.. 关于如何访问 EF 查询
【解决方案2】:

在 QueryBuilder 网站上,插件部分包括一个可以从 JavaScript 库发出 SQL 的插件 -

http://querybuilder.js.org/plugins.html

这有帮助吗?或者您想在 c# 中接收 json 并手动翻译(或使用 NuGet 包,尽管我不知道)?将 SQL 子句从客户端代码传递到服务器执行可能存在安全问题。

【讨论】:

  • 真棒知道 NuGet 包,我认为他是一个更好的答案:)
  • 客户端的这条 SQL 是不安全的,并且会向最终用户暴露很多东西。所以我想接收 JSON 并将其转换为我的 SQL 条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多