注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Lucifer 的博客

网易英超评论专栏

 
 
 

日志

 
 
 
 

LINQ TO DataSet Overview  

2008-01-15 17:01:16|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

 

Query UnTyped DataSet

 

和一般的LINQ相比,query对象是untyped DataSet的时候,使用FieldSetField来读写不同的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 IQueryableinterface,所以如果想把它作为一个可以查询的对象的话,要先用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 .FieldSetField是使用并不局限在LINQ query当中,在程序的其他地方也能使用,可以用它去替代以前的我们访问DataSet的方式,例如:

 

foreach( DataRow r in orderDetails.Rows ) {
    if (r.Field( "UnitPrice" ) <10 font>
        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这个基类,而这个基类已经实现了IEnumerableinterface

 

 

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了。

  评论这张
 
阅读(255)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017