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

posted on 2016-03-31 19:23  雯大侠  阅读(458)  评论(0编辑  收藏  举报

导航