zoukankan      html  css  js  c++  java
  • Asp.NET笔记(六)--使用linq+三层架构实现多表带条件的查询

    用linq实现多表带条件的查询
    一、在Model层添加linq to Sql类

      在项目中添加新建项-->linq to Sql类-->服务资源管理器添加数据连接-->将数据库中表拖拽到linq类中-->保存

      用linq实现多表查询需要额外在MODEL层添加一个可以存放多表字段的实体类

      如: 

    namespace MODEL
    {
        /// <summary>
        /// 设备表+设备缺陷表实体类
        /// </summary>
      public  class DeviceDefect
        {
            public int DefectID { get; set; } //缺陷编号
            public int DefectType { get; set; } //缺陷类型
            public string Content { get; set; } //缺陷说明
            public DateTime AddTime { get; set; } //添加事件
            public int? DefectState { get; set; } //缺陷状态  ?为数据库可空字段
            public DateTime? DealTime { get; set; } //处理事件 ?为数据库可空字段
            public int? DeviceID { get; set; } //设备编号 ?为数据库可空字段
            public string DeviceName { get; set; } //设备名称
    
        }
    }

    二、在DAL层实现数据的带条件的查询
    如:

      

     /// <summary>
            /// 带条件的查询
            /// </summary>
            /// <param name="DeviceID">设备编号</param>
            /// <param name="Content">缺陷内容</param>
            /// <param name="DefectState">缺陷状态</param>
            /// <returns></returns>
            public List<DeviceDefect> SelectByDeviceIdByContentByType(int DeviceID=-1,string Content="",int DefectState=-1)
            {
    
                var res = from d in db.Defect //设备缺陷表
                          from dev in db.Device //设备表
                          //使用let子句拼接查询条件
                          let aa= DeviceID!=-1? d.DeviceID== DeviceID:true  //如果设备id不等于-1添加查询条件,否则做全查询
                          let bb= Content!=""?d.Content.Contains(Content):true //如果缺陷内容不为空添加查询条件,否则做全查询
                          let cc= DefectState!=-1?d.DefectState== DefectState:true //如果缺陷处理状态不等于-1添加查询条件,否则做全查询
                          where d.DeviceID == dev.DeviceID  && aa && bb && cc //拼接多条件
                  //查询内容如下 实例化一个新的实体作为多表查询的结果
    select new DeviceDefect //设备缺陷表+设备表 ,new后面一定要加model层新添加的实体类 { DeviceName = dev.DeviceName, //将表中字段值赋值给实体类字段 DefectID = d.DefectID, DefectType = d.DefectType, AddTime = d.AddTime, Content = d.Content, DealTime = d.DealTime, DefectState = d.DefectState, DeviceID = d.DeviceID };        //返回转换为List<DeviceDefect>集合的结果
    return res.ToList();
            }

    三、在BLL层实现DAL层方法的调用
    如:

            /// <summary>
            /// 带条件的查询
            /// </summary>
            /// <param name="DeviceID">设备编号</param>
            /// <param name="Content">缺陷内容</param>
            /// <param name="DefectState">缺陷状态</param>
            /// <returns></returns>
            public List<DeviceDefect> SelectByDeviceIdByContentByType(int DeviceID = -1, string Content = "", int DefectState = -1)
            {
                return dAL.SelectByDeviceIdByContentByType(DeviceID,Content,DefectState);     //注意括号内参数的赋值      
            }    

    四、在UI层实现对BLL方法的调用和数据的展示
    如:

     

         //查询按钮单击事件
         protected
    void BtnSelectByTiaojian_Click(object sender, EventArgs e) { //获取查询内容 int DeviceID = int.Parse( this.DropDownList1.SelectedValue); string content = TextBox1.Text; int DefectState = int.Parse( this.RadioButtonList1.SelectedValue); //调用带条件的查询方法得到查询结果 List<DeviceDefect> list = bll.SelectByDeviceIdByContentByType(DeviceID, content, DefectState); //把结果绑定给数据展示控件 this.GridView1.DataSource = list; this.GridView1.DataBind(); }

     

     ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    写完这篇博文后有朋友建议说,多表的查询我们可以在数据库写一个视图,这样查询的时候就可以直接拉视图到linq to sql类中去使用了,而且在带条件查询时,可以直接拼接查询条件,亲测可行,用起来很方便,真香,分享给大家

    在数据库中

        --创建视图
        --create view 视图名
        --as
        --    select 语句
        --go
        
        if exists (select * from sys.views where name='View_SelectDefectAndDefect')
        drop view View_SelectDefectAndDefect
        go
        
        create view View_SelectDefectAndDefect
        as    
            select DefectID, DefectType, Content, AddTime, DefectState, DealTime,defect.DeviceID,DeviceName 
            from Defect join Device on Device.DeviceID=Defect.DeviceID    
        go
        

    在Model层的linq类中

    (这里应有一张图)

    在DAL层中直接查询视图即可

     /// <summary>
            /// 多表查询
            /// </summary>
            /// <returns></returns>
            public List<View_SelectDefectAndDefect> SelectAllDefect()
            {
                //第一步:实例化数据上下文对象
                DataMachineDBDataContext db = new DataMachineDBDataContext();
    
                //第二步:使用linq进行数据查询
                var result = from i in db.View_SelectDefectAndDefect  //引用system.data.linq
                             select i;
                //直接返回linq类型的数据列表
                List<View_SelectDefectAndDefect> list = result.ToList();
    
                return list;            
            }

    在BLL中

    /// <summary>
            /// 多表查询
            /// </summary>
            /// <returns></returns>
            public List<View_SelectDefectAndDefect> SelectAllDefect()
            {
                DefectDAL dal = new DefectDAL();
                return dal.SelectAllDefect();
    
            }

    在UI层再对查到的数据进行筛选

      //查询按钮
            protected void Button1_Click(object sender, EventArgs e)
            {
                //实例化bll对象
                DefectBLL bll = new DefectBLL();
                //先查询所有的数据
                List<View_SelectDefectAndDefect> list = bll.SelectAllDefect();
    
                //再对list集合的结果进行条件筛选
                //获取条件
                int deviceID = int.Parse(this.DropDownList1.SelectedValue);//设备ID
                string content = this.TextBox1.Text;
                int state = int.Parse( this.RadioButtonList1.SelectedValue);
                //分条件筛选
                if (deviceID != -1)
                {
                    //筛选设备id对象m,m对象的DeviceID等于条件的deviceID,得到集合
                    list = list.Where(m => m.DeviceID == deviceID).ToList();
                }
                if (content != "")
                {
                    //筛选缺陷内容中是否包含用户输入的条件内容,Contains():判断是否包含某个元素
                    list = list.Where(m => m.Content.Contains(content)).ToList();
                }
                if (state != -1)
                {
                    list = list.Where(m => m.DefectState == state).ToList();
                }
                //将筛选后的结果赋值给数据显示控件
                this.GridView1.DataSource = list;
                this.GridView1.DataBind();
            }

    这样也可以实现条件筛选,但是这种情况是假筛选,其实查询的还是所有数据,所以不适合大批量的数据。

  • 相关阅读:
    matlab中用来批量读取的dir函数
    cat 函数应用
    线性移不变系统
    为什么低频信息描述了图像在光滑部位的整体灰度信息,而高频部分则反映了图像在边缘、噪声等细节方面的表现?
    红灯检测宇视科技专利分析与总结2
    红灯检测宇视科技专利分析与总结1
    matlab中冒号的用法
    第一篇博文,大橙子的博客生涯要开始啦
    Spring Boot和Shiro整合
    Spring Boot + Redis使用短信平台发送验证码(腾讯云短信平台)
  • 原文地址:https://www.cnblogs.com/JuneDream/p/14147914.html
Copyright © 2011-2022 走看看