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();
        }

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

 

posted @ 2020-12-17 09:36  JuneDream  阅读(799)  评论(0编辑  收藏  举报