LINQ to DataSet 【转载】

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/04/12/1434020.html
原文标题:LINQ to DataSet 【转载】
原文发表:2009/4/11 21:59:00

本文转载自http://www.cnblogs.com/ruciffa/archive/2008/03/08/1096007.html

 

相对而言,LINQ TO DataSet是LINQ技术中最小的一块,虽然是DB中抽取出来的一个离线的操作模型,但毕竟对象也是个内存里面的object而已。所以和LINQ TO Object相比,大多数的操作都是一样的,不同只是要根据DataSet,DataTable的结构标明字段而已。下面简单的列出LINQ TO DataSet相比LINQ TO Object一些要注意的特色。

Query UnTyped DataSet

和一般的LINQ相比,query对象是untyped DataSet的时候,使用Field 和SetField 来读写不同的column字段,下面是一个简单的例子:

DataTable orders = ds.Tables["Orders"];

DataTable orderDetails = ds.Tables["OrderDetails"];

var query =

from o in orders.AsEnumerable()

where o.Field ( "OrderDate" ).Year >= 1998

orderby o.Field ( "OrderDate" ) descending

select o;

在这里大致要注意三点

1.因为untyped DataSet没有实现IEnumerable 和 IQueryable 的interface,所以如果想把它作为一个可以查询的对象的话,要先用AsEnumerable() 或者AsQueryable()转换一下,将它转换成IEnumerable 或者IQueryable 对象才能用LINQ去查询。如:from o in orders.AsEnumerable()

2.一般是使用使用Field (“Column A”)和SetField (“Column A”)来读写不同的column字段对应的element,用它来访问相对于以前我们用ds.Tables["Orders"].Row[“RowA”][ “Column A”]的访问模式比起来,一个很大的好处就是可以避免null类型产生的exception。我们以前从DataSet里面取数据的时候,如果取的出来的是null,就会抛出exception,所以我们经常作类似if(ds.Tables["Orders"].Row[“RowA”][ “Column A”]!=null)的判断来包装我们进一步的逻辑处理,但是用Field (“Column A”)就可以避免这种麻烦。因为Field (“Column A”)是nullable的。这个特性的由来是 这个泛型的使用,比如你取int类型数据的时候,如果你觉得它可能是null,那你就可以用Field (“Column A”)去取,这样就可以避免了exception的抛出。

3 .Field 和SetField 是使用并不局限在LINQ 的query当中,在程序的其他地方也能使用,可以用它去替代以前的我们访问DataSet的方式,例如:

foreach( DataRow r in orderDetails.Rows ) {
    if (r.Field
 
 
  
  ( "UnitPrice" ) < 10 ){
 
 
        r.SetField
 
 
  
  ( "UnitPrice", 10 );
 
 
    }
}

Query Typed DataSet

这就更加简单了。对于定义了类型的DataSet,我们可以象查询内存中一般的object那样去查询它。例如:

var query =
    from    o in ds.Orders
    where   o.OrderDate.Year >= 1998
    orderby o.OrderDate descending
    select  new { o.OrderID, o.OrderDate,
                  Amount = o.GetOrder_DetailsRows().Sum(
                               od => od.UnitPrice * od.Quantity ) };

还有一个与untyped DataSet不同的地方是在查询它的时候不需要使用AsEnumerable() 或者AsQueryable()那样的转换方法了。因为所有定义好的DataSet都是继承了TypedTableBase 这个基类,而这个基类已经实现了IEnumerable 的interface

Query DataSet中的relation

DataSet当中有时候也是有relation的,和DB一样,例如在下面的DataSet中加入relation:

DataTable orders = ds.Tables["Orders"];
DataTable orderDetails = ds.Tables["OrderDetails"];
ds.Relations.Add( "OrderDetails",
                  orders.Columns["OrderID"],
                  orderDetails.Columns["OrderID"]);

如果我们想像在LINQ TO SQL里面一样通过relation来访问与其有相关关系的table,可以使用GetChildRows方法来取得与当前table相关联的那个table里面的DataRows,并将其返回为可以查询的IQueryable 对象。例如:

var query =
    from    o in orders.AsEnumerable()
    where   o.Field
 
 
  
  ( "OrderDate" ).Year >= 1998
 
 
    orderby o.Field
 
 
  
  ( "OrderDate" ) descending
 
 
    select  new { OrderID = o.Field
 
 
  
  ( "OrderID" ),
 
 
                  OrderDate = o.Field
 
 
  
  ( "OrderDate" ),
 
 
                  Amount = o.GetChildRows( "OrderDetails" ).Sum(
                               od => od.Field
 
 
  
  ( "UnitPrice" )
 
 
                                     * od.Field
 
 
  
  ( "Quantity" ) ) };
 
 

这样我们就能通过relation来访问对象table了。

作者:陈希章
出处:http://blog.csdn.net/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值