从c#对象动态构建SQL WHERE子句

本文关键字:SQL WHERE 子句 构建 动态 对象 | 更新日期: 2023-09-27 18:01:12

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

{
 "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"
       }]
   }]
}

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

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 ;  
 }  

从c#对象动态构建SQL WHERE子句

您可以使用Dynamic Linq Query Builder

例如:我们从jqueryquerybuilder传递规则,而不是从DB构建查询和检索相关数据

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

更新:

obj已经使用过滤规则反序列化json(来自jqueryquerybuilder(context.messages-是实体框架上下文的一部分

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

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

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

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

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