首页 / 软件开发 / LINQ / LINQ TO DataSet Overview
LINQ TO DataSet Overview2010-12-14ruciffaLINQ TO DataSet Overview相对而言,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<DateTime>( "OrderDate" ).Year >= 1998
orderby o.Field<DateTime>( "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<decimal>( "UnitPrice" ) < 10 ){
r.SetField<decimal>( "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 ) };