多条件组合查询,解决方案记录
1 今天的讲解什么?
多条件组合查询,解决方案记录
2 三种解决方案
- 多条件查询技巧ado.net
- ef组合查询
- 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 关键点记录如下
- 采用
Dapper
的DynamicParameters
- 如果不了解
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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?