zoukankan      html  css  js  c++  java
  • 多条件组合查询,解决方案记录

    1 今天的讲解什么?

    多条件组合查询,解决方案记录

    2 三种解决方案

    1. 多条件查询技巧ado.net
    2. ef组合查询
    3. dapper组合查询(最喜欢用这个)

    3 相关介绍

    3.1 这个是什么?

    如何解决系统中常用的多条件组合查询?解决方案记录如下所示。

    3.2 应用场景?

    在开发系统中经常会这样的需求,多个条件组合去查询记录。记得刚刚毕业那一会,写这个功能感觉好难啊,后来在网上找到一些前辈们的教程,才解决这个功能,现在拿出来整理 一下(都是前辈们的成果),哈哈 ,本人菜鸡,大牛勿喷。

    4 下面来分别来看看三种解决方案的细节

    4.1 多条件查询技巧ado.net

       #region 多条件搜索时,使用List集合来拼接条件(拼接Sql)
    
                StringBuilder sql = new StringBuilder("select * from PhoneNum");
                List<string> wheres = new List<string>();
                if (cboGroup.SelectedIndex != 0)
                {
                    wheres.Add(" ptypeid=" + cboGroup.Text.Split('|')[0]);
                }
                if (txtSearchName.Text.Trim().Length > 0)
                {
                     wheres.Add(" pname like '%" + txtSearchName.Text.Trim() + "%'");
                }
                if (txtSearchCellPhone.Text.Trim().Length > 0)
                {
                     wheres.Add(" pcellphone like '%" + txtSearchCellPhone.Text.Trim() + "%'");
                }
    
                //判断用户是否选择了条件
                if (wheres.Count > 0)
                {
                    string wh = string.Join(" and ", wheres.ToArray());
                    sql.Append(" where " + wh);
                }
                #endregion
     
     
     
                #region 多条件搜索使用带参数的sql语句
                StringBuilder sql = new StringBuilder("select * from PhoneNum");
                List<string> wheres = new List<string>();
                List<SqlParameter> listParameter = new List<SqlParameter>();
                if (cboGroup.SelectedIndex != 0)
                {
                    wheres.Add(" ptypeid=@typeid ");
                    listParameter.Add(new SqlParameter("@typeid", cboGroup.Text.Split('|')[0]));
                }
                if (txtSearchName.Text.Trim().Length > 0)
                {
                    wheres.Add(" pname like @pname ");
                    //pname like '%乔%'
                    //pname liek '%'+@pname+'%'
                    listParameter.Add(new SqlParameter("@pname", "%" + txtSearchName.Text.Trim() + "%"));
                }
                if (txtSearchCellPhone.Text.Trim().Length > 0)
                {
                    wheres.Add(" pcellphone like @cellphone ");
                    listParameter.Add(new SqlParameter("@cellphone", "%" + txtSearchCellPhone.Text.Trim() + "%"));
                }
    
                //判断用户是否选择了条件
                if (wheres.Count > 0)
                {
                    string wh = string.Join(" and ", wheres.ToArray());
                    sql.Append(" where " + wh);
                }
     
                SqlHelper.ExecuteDataTable(sql.ToString(), listParameter.ToArray());
                #endregion
    

    原文链接

    4.2 ef组合查询

     [HttpPost]
            public ActionResult Query(string city, string company,string contactName)
            {
                using (var context = new NorthwindEntities())
                {
                    
                    var parameter = Expression.Parameter(typeof(Customers));
                    var type = typeof(Customers);
                    Expression expr = Expression.Constant(true);
                    var methodInfo = typeof(string).GetMethod("Contains", new Type[] { typeof(string) });
                    if (!string.IsNullOrEmpty(city))
                    {
                        expr = Expression.And(expr,
                            Expression.Equal(Expression.Property(parameter, "City"), Expression.Constant(city)));
                    }
                    if (!string.IsNullOrEmpty(company))
                    {
                        expr = Expression.And(expr,
                            Expression.Call(Expression.Property(parameter, "CompanyName"), methodInfo, Expression.Constant(company)));
                    }
                    if (!string.IsNullOrEmpty(contactName))
                    {
                        expr = Expression.And(expr,
                            Expression.Call(Expression.Property(parameter, "ContactName"), methodInfo, Expression.Constant(contactName)));
                    }
                    var lambda = Expression.Lambda<Func<Customers, bool>>(expr, parameter);
                    return this.View(context.Customers.Where<Customers>(lambda).ToList<Customers>());
                }
            }
    

    原文链接

    4.3 dapper组合查询(最喜欢用这个)

    4.3.1 关键点记录如下
    1. 采用DapperDynamicParameters
    2. 如果不了解Dapper,可以博客园中搜索一下Dapper的相关方法
    public List<MSys_Admin> GetAdminList(MSys_Admin model)
    {
     string sqlText = "select count(1) from Sys_Admin where 1=1";
     var p = new DynamicParameters();
     if (!string.IsNullOrEmpty(model.LoginName))
     {
      sqlText += " and LoginName like @LoginName";
      p.Add("LoginName", model.LoginName+"%");
     }
     if (!string.IsNullOrEmpty(model.Name))
     {
      sqlText += " and Name like @Name";
      p.Add("Name","%"+ model.Name+"%");
     }
     using (var conn = Common.GetConn())
     {
      conn.Open();
      var r = conn.Query<MSys_Admin>(sqlText, p);
      conn.Close();
      return r.ToList();
     }
    }
    

    原文链接

    5 相关参考教程整理

    1. 多条件查询--使用dapper命令参数动态拼接出最安全的sql语句
    2. 摘自本人的有道云笔记
    3. ado.net相关
    4. ef相关
    5. dapper相关
  • 相关阅读:
    包装器
    高级new创建
    野性的呼唤 第三章
    SourceTree的基本使用
    SAP的春天回来么?
    dirname命令和basename命令
    一个简单的ETL脚本的内容
    轮子:读取config.ini文件
    sed基础语法
    hivesql之str_to_map函数
  • 原文地址:https://www.cnblogs.com/yu-yi/p/7744731.html
Copyright © 2011-2022 走看看