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

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相关
posted @ 2017-10-27 22:08  小学生学编程  阅读(1400)  评论(0编辑  收藏  举报