麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Linq To DataSet

2019-11-17 02:33:08
字體:
來源:轉載
供稿:網友

Linq To DataSet

相對而言,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<T>和SetField<T>來讀寫不同的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<T> 和 IQueryable<T>的interface,所以如果想把它作為一個可以查詢的對象的話,要先用AsEnumerable() 或者AsQueryable()轉換一下,將它轉換成IEnumerable<T>或者IQueryable<T>對象才能用LINQ去查詢。如:from o in orders.AsEnumerable()

2.一般是使用使用Field<T>(“Column A”)和SetField<T>(“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<T>(“Column A”)就可以避免這種麻煩。因為Field<T>(“Column A”)是nullable的。這個特性的由來是<T>這個泛型的使用,比如你取int類型數據的時候,如果你覺得它可能是null,那你就可以用Field<int?>(“Column A”)去取,這樣就可以避免了exception的拋出。

3 .Field<T>和SetField<T>是使用并不局限在LINQ 的query當中,在程序的其他地方也能使用,可以用它去替代以前的我們訪問DataSet的方式,例如:

foreach( DataRow r in orderDetails.Rows ) {

if (r.Field<decimal>( "Unit

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 ) };

還有一個與untyped DataSet不同的地方是在查詢它的時候不需要使用AsEnumerable() 或者AsQueryable()那樣的轉換方法了。因為所有定義好的DataSet都是繼承了TypedTableBase<T>這個基類,而這個基類已經實現了IEnumerable<T>的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<T>對象。例如:

var query =

from o in orders.AsEnumerable()

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

orderby o.Field<DateTime>( "OrderDate" ) descending

select new { OrderID = o.Field<int>( "OrderID" ),

OrderDate = o.Field<DateTime>( "OrderDate" ),

Amount = o.GetChildRows( "OrderDetails" ).Sum(

od => od.Field<decimal>( "UnitPrice" )

* od.Field<short>( "Quantity" ) ) };

這樣我們就能通過relation來訪問對象table了。

來源: <http://www.companysz.com/ruciffa/archive/2008/03/08/1096007.html>


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人午夜免费在线视频 | 国产一精品久久99无吗一高潮 | 欧美亚洲国产一区二区三区 | 最新av免费网址 | 欧美精品一区二区久久 | 欧美一极视频 | 欧美日韩亚洲成人 | 99国语露脸久久精品国产ktv | 久久国产精品影视 | 国产日产精品一区四区介绍 | 午夜视频亚洲 | 久草视频福利在线观看 | 成人午夜看片 | 天天黄色片 | 精品一二三区视频 | 91黄瓜视频| 一级黄色片武则天 | 精品国产一区二区三区四区在线 | 精品国产一区二区三区久久久蜜月 | 二区三区四区 | 欧美黄色三级视频 | aaaaaaa毛片 | 一级裸体视频 | 日韩电影一区二区 | 一本色道久久久888 香蕉视频99 | 在线亚洲播放 | 国产一国产精品一级毛片 | 国产精品久久久久久久四虎电影 | 欧美一级美国一级 | 日韩毛片一区二区三区 | 免费激情视频网站 | 羞羞视频免费视频欧美 | 欧美成人免费电影 | 欧美国产二区 | 久久久电影电视剧免费看 | 多男操一女视频 | 高清国产免费 | 国产毛片aaa一区二区三区视频 | 国产精品午夜未成人免费观看 | 亚洲视频在线观看免费 | 久久99亚洲精品久久99果 |