C#用到的多条件查询

1 篇文章 0 订阅

在winform做查询时,都会用到多条件查询。

比如这个页面:



用户也许每个查询条件都填,也许填1个,也许填2个等等。

这里按照三层的写法:


思路: 假设这里用的是 TblStudent 表
1. Mode l文件夹里 首先建立2个类:
第一个类:存放表的字段,把这些字段当成属性。TblStudentModel.cs 
第二个类:存放查询的字段、查询的运算符(这里可以采用枚举)、查询的值 等三个属性。TblStudentField.cs
2.UI层。 把要查询的条件,放到一个List集合里,传递给BLL层。
3.BLL层 ,打酱油,把从UI层获取的查询条件传递给DAL层。TblStudentBll.cs
4.DAL: 主要就4个数据存放。 TblStudentDal.cs
第一个:查询语句
第二个:查询语句where 后面的条件
第三个:sql参数列表
第四个:得到数据后,返回的List集合

具体代码实现:

首先是Model层里:

1.TblStudentField.cs :存放查询的字段、运算符和查询的值

public class TblStudentField
    {
        //查询的字段名称
        public string FieldName
        { get; set; }

        //查询的运算符
        public Operater Op
        { get; set; }

        //查询的值
        public string Value
        { get; set; }

    }
    //运算符的枚举
    public enum Operater
    {
        Qt,
        Lt,
        Eq,
        like
    }


2.TblStudentModel.cs文件:存放表里的字段

 public class TblStudentModel
    {
        //字段列表: tSId, tSName, tSGender, tSAddress, tSPhone, tSAge

        public int Id
        { get; set; }

        public string Name
        { get; set; }


        public string Gender
        { get; set; }

        public string Address
        { get; set; }

        public string Phone
        { get; set; }

        public int? Age
        { get; set; }

    }


DAL层:存放具体查询的代码,里面要调用SqlHelper类里的方法。

TblStudentDal.cs文件里的代码:

public List<TblStudentModel> GetDataList(List<TblStudentField> tiaojians)
         {
             //存放查询后得到的集合
             List<TblStudentModel> DataList = new List<TblStudentModel>();
             //查询的sql语句,这里因为要拼接查询条件,所以使用的是StringBuilder类型
             StringBuilder cmdtxt = new StringBuilder("select * from tblstudent   ");
             //查询条件,采用List<string>的类型来获取条件,最后与上面的语句拼接。
             List<string> wheres = new List<string>();
             //SqlParameter集合,作为Sql的参数。因为如果是数组的话,比较麻烦,还要定义长度。
             List<SqlParameter> pms = new List<SqlParameter>();

             //获取查询条件。
             foreach (TblStudentField tiaojian in tiaojians)
             {
                 //先定义个参数列表
                 SqlParameter pm = new SqlParameter("@" + tiaojian.FieldName, tiaojian.Value);
                 //判断Enum运算符,对比生成为Sql使用的运算符。
                 string yunsf = ""; //首先定义个运算符
                 switch (tiaojian.Op)
                 {
                     case Operater.Qt:
                         yunsf = " > ";
                         break;
                     case Operater.Lt:
                         yunsf = " < ";
                         break;
                     case Operater.Eq:
                         yunsf = " = ";
                         break;
                     case Operater.like:
                         yunsf = " like ";
                         pm.Value = "%" + pm.Value + "%";//因为如果是like运算符,那么查询的值2变要%%
                         break;
                 }
                 //等到的条件:类似于id=@id,或者age=@age
                 string tiaoj = tiaojian.FieldName + yunsf + "@"+tiaojian.FieldName;
                 //把单个条件添加到条件集合里
                 wheres.Add(tiaoj);
                 //把sql参数添加到参数集合里.
                 pms.Add(pm);               
             }
             //先判断下where条件集合里是否有条件
             if (wheres.Count > 0)
                 cmdtxt.Append(" where " + string.Join(" and ", wheres));//通过string 拼接条件集合。在每个条件中间加入 and
             
             //根据查询条件,获取数据库里的数据,别忘了cmdtxt的类型是StringBuilder要转换下,还有pms的类型是List,也要转换下
             using (SqlDataReader dr = SqlHelper.ExecuteReader(cmdtxt.ToString(), System.Data.CommandType.Text, pms.ToArray()))
             {
                 if (dr.HasRows)
                 { 
                    while(dr.Read() )
                    {
                        //tSId, tSName, tSGender?, tSAddress?, tSPhone?, tSAge?, tSBirthday?, tSCardId?, tsClassId?
                        TblStudentModel ts = new TblStudentModel();
                        //因为有些字段是可空的,所以要判断
                        ts.Id = dr.GetInt32(0);
                        ts.Name = dr.GetString(1);
                        ts.Gender = dr.IsDBNull(2) ?null : dr.GetString(2);//string是引用类型,null 可以这样
                        ts.Address = dr.IsDBNull(3) ? null : dr.GetString(3);
                        ts.Phone = dr.IsDBNull(4) ? null: dr.GetString(4);
                        ts.Age = dr.IsDBNull(5) ? null : (int?)dr.GetInt32(5);//因为int是值类型,这要这样转换下
                        DataList.Add(ts);
                    }
                 }
                 return DataList;
             }
         }

UI层:

 //存放条件
            List<TblStudentField> tiaojians = new List<TblStudentField>();
            //字段列表tSId, tSName, tSGender, tSAddress, tSPhone, tSAge
            //根据查询栏是否有值,来进行判断
            if (txtId.Text.Length > 0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSId";
                sf.Op = Operater.Eq;
                sf.Value = txtId.Text.Trim();
                tiaojians.Add(sf);
            }
            if (txtName.Text.Length>0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSName";
                sf.Op = Operater.like;
                sf.Value = txtName.Text.Trim();
                tiaojians.Add(sf);
            }
            if (cboSex.Text.Length > 0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSGender";
                sf.Op = Operater.Eq;
                sf.Value = cboSex.SelectedItem.ToString();
                tiaojians.Add(sf);
            }
            if (txtAddress.Text.Length > 0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSAddress";
                sf.Op = Operater.like;
                sf.Value = txtAddress.Text.Trim();
                tiaojians.Add(sf);
            }
            if (txtPhone.Text.Length > 0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSPhone";
                sf.Op = Operater.like;
                sf.Value = txtPhone.Text.Trim();
                tiaojians.Add(sf);
            }
            if (txtAge.Text.Length > 0)
            {
                TblStudentField sf = new TblStudentField();
                sf.FieldName = "tSAge";
                sf.Op = Operater.Eq;
                sf.Value = txtAge.Text.Trim();
                tiaojians.Add(sf);
            }
            TblStudentBll bll = new TblStudentBll();
            //获取list集合
            List<TblStudentModel> datalist = bll.GetDataList(tiaojians);
            //将数据绑定到dataGridView中
            dataGridView1.DataSource = datalist;

把要查询的条件放到一个集合里好处,是为了以后的扩展, 查询条件多了。只要把多添加的条件加到后面就好了。

项目文件列表:



C#中实现高并发服务时,可以使用以下一些技术和工具来提高性能和可扩展性: 1. 异步编程:使用 async/await 关键字结合 Task 和 Task<T> 类来实现异步操作,避免线程阻塞,提高并发处理能力。 2. 线程池:使用 ThreadPool 类来管理线程池,重用线程以避免线程创建和销毁的开销。 3. 并发集合:使用线程安全的并发集合,如 ConcurrentQueue、ConcurrentStack、ConcurrentBag 和 ConcurrentDictionary,以避免多线程访问共享数据时的竞态条件。 4. 高级并发库:使用第三方库,如 Akka.NET、TPL Dataflow、Actor Model 等,提供更强大的并发处理能力。 5. 缓存:使用缓存技术(如内存缓存、分布式缓存)来减少对底层资源(如数据库)的频繁访问,提高响应速度和并发能力。 6. 消息队列:使用消息队列(如 RabbitMQ、Kafka)实现异步消息处理,将请求发送到队列中,由后台的工作线程进行处理,以提高服务的并发性能和可扩展性。 7. 分布式架构:使用分布式系统架构,将服务拆分为多个独立的微服务,通过负载均衡和服务发现来分发请求,提高并发处理能力和可扩展性。 8. 水平扩展:通过增加服务器节点、使用负载均衡技术和分布式缓存等手段,实现系统的水平扩展,以增加并发处理能力。 9. 响应式编程:使用响应式编程框架,如 Reactive Extensions(Rx),以声明式的方式处理并发事件流,简化异步编程和并发处理逻辑。 10. 性能优化:通过代码优化、数据库优化、网络优化等手段,提高系统的整体性能和并发处理能力。 综合运用以上技术和工具,可以在C#中实现高并发服务,提高系统的性能、可扩展性和响应能力。根据具体需求和场景,选择适合的技术来构建高性能的并发应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值