LINQ to DataSet
LINQ to DataSet的使用通常包含以下步骤:
(1)获取DataSet/DataTable数据源。LINQ to DataSet通过LINQ查询DataSet/DataTable中的数据,所以首先要准备DataSet/DataTable数据源,可以通过ADO.NET技术从数据库获取,可以通过XML技术从XML文件获取,也可以从其他任何形式的数据源获取,甚至可以在内存中直接创建并填充DataSet/DataTable对象。
(2)将DataTable转换成IEnumerable<T>类型。LINQ只能在IEnumerable<T>或IQueryable<T>接口对象上执行查询操作,而DataTable并没有实现这两个接口,不能直接查询。在LINQ to DataSet中,通过DataTableExtensions扩展的AsEnumerable()方法从DataTable获取一个等价的IEnumerable<T>对象。
(3)使用LINQ语法编写查询。LINQ to DataSet中查询的编写可以使用查询语法和方法语法,可以对它执行任何IEnumerable<T>允许的查询操作。
(4)使用查询结果。查询结果产生后,就可以使用查询结果(一个IEnumerable<T>对象),比如,用foreach遍历所有元素,用Max()等进行数值计算,将它作为数据源进行二次查询等。
关键语法
1.AsEnumerable:将DataTable转换成一个类型为IEnumerable<DataRow>的可枚举数据集合
例:
var query1 = from pl in dt.AsEnumerable( ) select pl;
2.Field<T>():通过它获取DataRow的某字段的数据
例:
foreach (var item in query1) //打印查询query1的结果 { //演示Field<T>方法的使用 System.Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", item.Field<string>("Name"), item.Field<string>("XingBie"), item.Field<int>("Age")); }
3.SetField<T>():用于设置数据表中指定列的数据,并且指定明确的数据类型
例:
foreach (var row in dtStu.AsEnumerable()) { int age = row.Field<int>("Age"); row.SetField<int>("Age", age + 2); }
4.CopyToDataTable():从数据表中获取到的查询结果(类型为IEnumerable<DataRow>)直接复制到一个新的数据表(DataTable)中,从而可以将查询结果绑定到界面控件(DataGridView等),也可以使用一些DataTable特有的特性
例:
var query1 = //查询query1年龄大于20且具有成绩的学生 from stu in dtStu.AsEnumerable( ) from score in dtScore.AsEnumerable( ) where stu.Field<int>("ScoreID") == score.Field<int>("ScoreID") where (int)stu["Age"] > 20 select stu; //通过CopyToDataTable()方法创建新的副本 DataTable newDt = query1.CopyToDataTable<DataRow>( );
5.AsDataView():从DataTable或LINQ查询创建一个与数据源对应的DataView对象
例:
//用DataTable.AsDataView()方法从数据表dt创建DataView对象dvDt DataView dvDt = dt.AsDataView( ); //query1用LINQ查询创建DataView对象dvDt,查询它所有的元素 EnumerableRowCollection<DataRow> query1 = from stu in dt.AsEnumerable( ) select stu; DataView dvNml = query1.AsDataView( ); //获取查询query1产生的DataView
6.DataRowComparer
//与免打扰中的用户进行比较,筛选出可以正常接收推送的用户 var normalReceive = dtUser.AsEnumerable().Except(dtDND.AsEnumerable(), DataRowComparer.Default); //比对两个表的用户名一致的,保存username到list中 var intersectUser = dtUserPower.AsEnumerable().Intersect(normalReceive, DataRowComparer.Default);
7.join
var query = from order in orders.AsEnumerable() join customer in customers.AsEnumerable() on order.Field<string>("CustomerID") equals customer.Field<string>("CustomerID") select new { CustomerID = order.Field<string>("CustomerID"), CompanyName = customer.Field<string>("CompanyName"), OrderDate = order.Field<DateTime>("OrderDate"), OrderID = order.Field<int>("OrderID") };
参考:http://yysyb123.blog.163.com/blog/static/1920504720104135734664/
http://www.cnblogs.com/yourancao520/archive/2013/05/24/3096769.html
http://www.cnblogs.com/chenxizhang/archive/2009/04/29/1445994.html