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(); }
这样也可以实现条件筛选,但是这种情况是假筛选,其实查询的还是所有数据,所以不适合大批量的数据。