本文转载自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
DataTable orders = ds.Tables["Orders"];
DataTable orderDetails = ds.Tables["OrderDetails"];
var query =
from o in orders.AsEnumerable()
where o.Field
orderby o.Field
select o;
在这里大致要注意三点
1.因为untyped DataSet没有实现IEnumerable
2.一般是使用使用Field
3 .Field
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
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了。