Linq to DataSet-查询ADO.NET数据集
Linq查询适用于实现了IEnumerable<T>接口或IQueryable<T>接口的数据源,而DataTable类没有实现其中的任一接口,因此必须调用AsEnumerable方法将DataTable作为LINQ查询from子句的源。
AsEnumerable方法将DataTable对象转换为EnumerableRowCollection<DataRow>对象
一、数据查询操作
string ConnectionString = "......";//声明连接字符串 using (SqlConnection conn = new SqlConnection(ConnectionString))//创建数据库连接对象 { string sqlstr = "select * from tb_Bookinfo";//定义查询语句 SqlDataAdapter da = new SqlDataAdapter(sqlstr, conn);//创建数据桥接器对象 DataSet ds = new DataSet();//创建数据对象 da.Fill(ds, "tb_Bookinfo");//填充数据集 //查找3月份出版的图书 var result = from b in ds.Tables["tb_Bookinfo"].AsEnumerable() where b.Field<DateTime>("b_pub_date").Month == 3 select new { bookname = b["b_name"].ToString(), author = b["b_pub_date"].ToString() }; foreach (var item in result)//遍历图书的书名和出版日期 { richTextBox1.Text +="书名:" + item.bookname + ";出版日期:" + item.author+"\n"; } }
Filed<T>方法用来提供对指定行中的每个列值的强类型访问
using (SqlConnection Conn = new SqlConnection(ConnectionString))//创建数据库连接对象 { string sqlstr = "select top 5* from tb_Bookinfo";//定义查询语句 SqlDataAdapter da = new SqlDataAdapter(sqlstr, Conn);//创建数据桥接器对象 DataSet ds = new DataSet();//创建数据对象 da.Fill(ds, "tb_Bookinfo");//填充数据集 //查询图书信息表前3行数据的图书名称和作者 var result = from b in ds.Tables["tb_Bookinfo"].AsEnumerable() select new { b_name = b.Field<string>("b_name"), b_author = b.Field<string>("b_author") }; foreach (var item in result)//遍历输出查询结果 { richTextBox1.Text +="图书名称:" + item.b_name + " ****** 作者:" + item.b_author+"\n"; } }
join on 子句接受两个源序列作为输入,每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含这样一个属性,join子句后使用特殊的equals关键字比较指定的键是否相等。
string ConnectionString = "server=WIN-GI7E47AND9R\\LS; database=db_TomeTwo; uid=sa; pwd=";//声明连接字符串 using (SqlConnection Conn = new SqlConnection(ConnectionString))//创建数据库连接对象 { string sqlstr = "select * from tb_Register";//定义查询语句 SqlDataAdapter da = new SqlDataAdapter(sqlstr, Conn);//创建数据桥接器对象 DataSet ds = new DataSet();//创建数据对象 da.Fill(ds, "register");//填充第一个数据表数据到DataSet sqlstr = "select * from tb_Sale";//定义查询语句 da.SelectCommand.CommandText = sqlstr;//指定第二条查询语句 da.Fill(ds, "sale");//填充第二个数据表数据到DataSet //查询有销售记录的药品信息 var result = from r in ds.Tables["register"].AsEnumerable() join s in ds.Tables["sale"].AsEnumerable() on r.Field<string>("药品编号") equals s.Field<string>("药品编号") select new { drug_name = r["药品名称"].ToString(), drug_factory = r["生产厂家"].ToString(), drug_sale = s["销售额"].ToString() }; foreach (var item in result) //遍历输出查询结果 { richTextBox1.Text += "药品名称:" + item.drug_name + "******生产厂家:" + item.drug_factory + "******销售额:" + item.drug_sale + "\n"; } }
orderby......descending子句实现对数据的降序排序
var result = from b in ds.Tables["tb_Bookinfo"].AsEnumerable() orderby b.Field<decimal>("b_price") descending select new { b_name = b["b_name"].ToString(), b_price = b["b_price"].ToString() };
Take方法用来从源序列的开头开始提取指定数量的元素,然后返回由这些元素组成的序列
string conStr = "Data Source=WIN-GI7E47AND9R\\LS;Database=db_TomeTwo;UID=sa;Pwd=;";//取连接字符串 string sql = "select * from EmployeeInfo";//构造sql语句 DataSet ds = new DataSet();//创建数据集 using (SqlConnection con = new SqlConnection(conStr))//创建数据连接 { SqlCommand cmd = new SqlCommand(sql, con);//创建Command对象 SqlDataAdapter sda = new SqlDataAdapter(cmd);//创建DataAdapter对象 sda.Fill(ds, "EmployeeInfo");//填充数据集 } if (cnt == null || cnt <= 0)//如果参数为空,取所有记录 { dataGridView1.DataSource = ds.Tables["EmployeeInfo"];//设置dataGridView1数据源 } else//如果参数不为空,取参数指定的记录数 { IEnumerable<DataRow> query = ds.Tables["EmployeeInfo"].AsEnumerable().Take(cnt ?? 0);//使用LINQ查询数据集 dataGridView1.DataSource = query.CopyToDataTable();//设置dataGridView1数据源 }
TakeWhile方法用来从源序列的开头开始提取满足指定条件的元素,然后返回由这些元素组成的序列
IEnumerable<DataRow> query = ds.Tables["EmployeeInfo"].AsEnumerable().TakeWhile(itm => itm.Field<DateTime>("Birthday") < Convert.ToDateTime("2009-7-1"));
Skip方法用来跳过源序列中指定数量的元素,然后返回由源序列剩余的元素组成的序列
IEnumerable<DataRow> query = ds.Tables["EmployeeInfo"].AsEnumerable().Skip(cnt ?? 0);//使用LINQ查询数据集 cnt是指定跳过的记录数
dataGridView1.DataSource = query.CopyToDataTable();//设置dataGridView1数据源
SkipWhile方法用来跳过源程序中满足指定条件的元素,然后返回由源程序剩余的元素组成的序列。
IEnumerable<DataRow> query = ds.Tables["EmployeeInfo"].AsEnumerable().SkipWhile(itm => itm.Field<DateTime>("Birthday") < Convert.ToDateTime("2009-7-1")); dataGridView1.DataSource = query.CopyToDataTable();//设置dataGridView1数据源
AsDataView方法用来将DataTable对象或EnumerableRowCollection<T>对象转换为支持LINQ的DataView对象
string conStr = "Data Source=WIN-GI7E47AND9R\\LS;Database=db_TomeTwo;UID=sa;Pwd=;";//取连接字符串 string sql = "select * from WarehouseInfo";//构造sql语句 DataSet ds = new DataSet();//创建数据集 using (SqlConnection con = new SqlConnection(conStr))//创建数据连接 { SqlCommand cmd = new SqlCommand(sql, con);//创建Command对象 SqlDataAdapter sda = new SqlDataAdapter(cmd);//创建DataAdapter对象 sda.Fill(ds, "WarehouseInfo");//填充数据集 } //LINQ查询数据集 IEnumerable<DataRow> query = from w in ds.Tables["WarehouseInfo"].AsEnumerable() where w.Field<double>("Area") < 5000 select w; DataTable dt = query.CopyToDataTable();//将LINQ查询结果集转换为DataTable dataGridView1.DataSource = dt;