Linq及其擴展
Linq是一種數據查詢語言(它能夠從多種數據源中查詢數據). 現在基於Linq的擴展有:
- Linq To Object:主要是從內存對象中查詢數據
- Linq To Sql:主要是從MS Sql Server數據庫中操縱(查詢\新增\修改\刪除)數據
- Linq To XML:主要是從XML片段或XML文檔中查詢數據
Linq To Sql簡介
Linq To Sql是一個微軟在.NET Framework 3.5中推出的一款ORM(Object Relation Model)實體框架.一個好的實體框架除了能夠將數據表映射為實體類,還應該支持使用面向的思想去操縱關系型數據庫.現在比較流行的ORM框架包括:Linq To Sql\Entity Framework\Nhibernate等.
我們在使用Linq To Sql的過程中,很少去手寫SQL語句就能實現常見的數據增刪改差操作.但是它的底層實現仍然是Ado.net.那么如何檢測Linq To Sql生成的SQL語句呢?通過DataContext的Log屬性即可實現檢測功能.
Linq To Sql設計器
在服務器資源管理器中通過拖拽的方式,將數據表放置到Linq To Sql的設計器區域后,VS會自動將這些數據表生成N+1(N為數據表的個數)個類.這些類大致可以分為2種:一種是數據庫上下文,另一種是實體類.數據庫上下文類就是名稱以DataContext結尾的類,它繼承自Sytem.Data.Linq.DataContext.
他們的作用分別是:DataContext類用於和數據庫交互(增刪改查),每次進行數據庫操作時,都應該先創建該類對象;
而每一個實體類則和數據表相對應.
DataContext的特性標記為Database,表示與數據庫相關
實體類的特性標記是Table,表示與數據表相關
實體類中屬性的特性標記是Column,表示與數據列相關
DataContext數據庫上下文類的常用屬性和方法
CreateDatabase():創建數據庫
DeleteDatabase():刪除數據庫
DatabaseExits():判斷數據庫是否存在
Log:該屬性用於檢測和寫入LINQ TO SQL生成的SQL語句
Linq To Sql常用操作
新增數據
void InsertOnSubmit():實現每次新增1條記錄
void InsertAllOnSubmit():實現一次新增多條記錄
注意:調用InsertOnSubmit后,一定要再調用DataContext.SubmitChanges();
修改數據
首先,查詢到要修改的元素
其次,改變元素相應的屬性
最后,調用dataContext.SubmitChanges()
刪除數據
首先,查詢到要刪除的元素
其次,調用void DeleteOnSubmit()刪除單個元素,如果要刪除多個可以調用void DelteAllOnSubmit()
最后,調用dataContext.SubmitChanges();
數據查詢
數據查詢時,有2種常用的使用方式.一種是使用linq的標准語法;一種是使用Lambda表達式擴展方法.
單表查詢:
多表查詢:
典型應用場景
場景1:在一個頁面中實現:添加一個工資模版,以及該工資模版的多個工資條目
做法一:
做法二:
上述兩種做法都可以實現功能.做法一是先實現工資模版的新增,然后再新增工資條目.做法二是向工資模版對象中添加多個工資條目,然后向數據庫提交工資模版.
需要注意的是,做法一中為工資條目對象設置了工資模版ID,而做法二並沒有為工資條目設置工資模版ID.但為什么最后效果卻是一樣的呢?
因為我們將工資條目添加到工資模版對象中時,linq to sql會自動將主外鍵關系的字段賦值.
場景二:使用Linq To Sql進行分頁
分頁功能需要使用兩個函數進行組合:Skip()和Take()
Skip(int count):跳過count條數據
Take(int count):從開始位置提取count條記錄
分頁查詢: dataContext.XXX.Skip(pageIndex * pageSize).Take(pageSize)
pageIndex是要提取的第幾頁記錄.pageIndex >= 0
pageSize是每頁顯示的記錄條數
其他
- EntitySet<T>:該類表示數據實體的集合
- System.Data.Linq.Table<T>:該類表示數據表對象
- 如何判定通過Linq To Sql進行數據的修改\刪除\新增是否成功?
因為InsertOnSubmit方法和DataContext.SubmitChanges()方法都沒有任何返回值,所以無法通過他們判斷出是否操作成功.判斷的標准就是:如果不拋出異常就成功,拋出異常肯定就失敗了.
- 對於標識列(自動生成列)而言,在調用DataContext.XXX.InsertOnSubmit()后是無法獲取標識列的值的;只有在調用DataContext.SubmitChanges()后方能獲取標識列的值.