简单多条件动态查询的实现

今天公司有个项目需要到多个条件查询的功能,以前两三个条件的时候就用if去判断,草草了事,由于这次有5-9个条件不等的情况下,总不能都用if吧,虽说能实现,不过这代码看上去也太难看,最重要的是没有重用性,也不方便修改,网上找了下,五花八门的,要费时间去理解它,还不如自己封装下,也便于以后的使用:

我前端用的是BUI来设计的,所以条件的传递方式是get/post,所以这个方法是针对“查询条件来自get/post方式的”,如果是用服务器控件传的,这种方式是不适合的哦

好了,首先,为了方便存储每个字段的键值和比较关系,先建立一个Condition类,方便以后操作,代码如下:

 

复制代码
 public class Condition
    {
        //字段名
        public string paramName { get; set; }
        //字段值
        public string paramValue { get; set; }
        //操作符
        public ConditionOperate Operation { get; set; }

        // 查询所用到的运算操作符
        public enum ConditionOperate : byte
        {
            Equal,           // 等于
            NotEqual,      // 不等于
            Like,             // 模糊查询
            Lessthan,      // 小于等于
            GreaterThan,  // 大于等于
            Less,          //小于
            Greater      //大于
        }
    }
复制代码

 

接着,创建一个拼接查询条件的类:

 

复制代码
  public static class ConditionBuilder
    {
        public static string  getWhere<T>(List<Condition> conditions)
        {
            //获取类型
            Type t = typeof(T);
            //获取类型中的属性集合
            PropertyInfo[] properties = t.GetProperties();
            foreach (PropertyInfo p in properties)
            {
                string colName = p.Name;
                //这里参数是通过url地址栏来(get方式)的,所以用Request.QueryString,如果是post(方式),改做下面的Request.From就好
                for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
                {
                    string value = HttpContext.Current.Request.QueryString[i].ToString();
                    //如果字段存在并且不为空
                    if (colName == HttpContext.Current.Request.QueryString.GetKey(i).ToString() && !string.IsNullOrEmpty(value))
                    {
                        Condition ct = new Condition();
                        ct.paramName = colName;
                        ct.paramValue = value;
                        ct.Operation = Condition.ConditionOperate.Equal;
                        conditions.Add(ct);
                    }
                }

            }
            // 数组元素的顺序应该与ConditionOperate枚举值顺序相同
            string[] operateType = { " = ", " <> ", " Like ", " <= ", " >= ", " < ", " > " };
            StringBuilder strWhere = new StringBuilder();
            strWhere.Append(" 1=1 ");

            foreach (Condition item in conditions)
            {
                int index = (int)item.Operation;

                strWhere.Append(" and " + item.paramName + operateType[index] + "'" + item.paramValue + "'");
            }
  
            return strWhere.ToString();
        }
    }
复制代码

 

这里,后台直接调用

        List<Condition> conditions = new List<Condition>();
        string strWhere = ConditionBuilder.getWhere<Sends>(conditions);

当然,有一些特殊字段需要做特殊处理的话,也可以在调用getWhere先处理下。
最后的结果是:

访问http://localhost:14073/Index/GetData?a=a1&b=b1&start=0&limit=10&pageIndex=0&field=SendsID&direction=ASC&Receiver=%E9%83%AD%E4%BC%9F&FromUserName=8&FromSchoolName=87&SmsContent=8&SmsType=1&SendStatus=1&StartTime=&EndTime=&_=1404199763638

得到:1=1 and FromUserName = '8' and FromSchoolName = '87' and SmsType = '1' and SmsContent = '8' and SendStatus = '1' and Receiver = '郭伟'

 

 

本人也是菜鸟,此方法只能用来处理普通的查询,对于复杂条件查询的还希望有高手赐教,如果大家有其他好的,也希望能分享下。当然,此方法也不适用于linq和ef,

如果有做过linq和ef动态条件查询的朋友也希望分享下。谢谢!

 

posted @   最爱晴天  阅读(4582)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示