Linq呼叫SubmitChanges方法

2021-09-01 01:52:02 字數 2598 閱讀 3012

linq submitchanges方法計算要插入、更新或刪除的已修改物件的集,並執行相應命令以實現對資料庫的更改。

無論物件做了多少項更改,都只是在更改記憶體中的副本。並未對資料庫中的實際資料做任何更改。直到對datacontext顯式linq submitchanges,所做的更改才會傳輸到伺服器。呼叫時,datacontext會設法將我們所做的更改轉換為等效的sql命令。我們也可以使用自己的自定義邏輯來重寫這些操作,但提交順序是由datacontext的一項稱作「更改處理器」的服務來協調的。事件的順序如下:

1. 當linq submitchanges方法時,linq to sql會檢查已知物件的集合以確定新例項是否已附加到它們。如果已附加,這些新例項將新增到被跟蹤物件的集合。

2. 所有具有掛起更改的物件將按照它們之間的依賴關係排序成乙個物件序列。如果乙個物件的更改依賴於其他物件,則這個物件將排在其依賴項之後。

3. 在即將傳輸任何實際更改時,linq to sql會啟動乙個事務來封裝由各條命令組成的系列。

4. 對物件的更改會逐個轉換為sql命令,然後傳送到伺服器。

如果資料庫檢測到任何錯誤,都會造成提交程序停止並引發異常。將回滾對資料庫的所有更改,就像未進行過提交一樣。datacontext 仍具有所有更改的完整記錄。

下面**說明的是在資料庫中查詢customerid為alfki的顧客,然後修改其公司名稱,第一次更新並linq submitchanges方法,第二次更新了資料但並未linq呼叫submitchanges方法。

//查詢  

customer cust

= db

.customers.first(c

=>

c.customerid

== "alfki");  

//更新資料並呼叫submitchanges()方法  

cust.companyname

= "yjinglee's blog"

;  

db.submitchanges();  

//更新資料沒有呼叫submitchanges()方法  

cust.companyname

= ""

動態查詢

var c1

= expression

.parameter(typeof(customer), "c");  

propertyinfo city

= typeof

(customer).getproperty("city");  

var pred

= expression

.lambda<

func

<

customer

, bool>

>

(  

expression.equal(  

expression.property(c1, city),  

expression.constant("seattle")  

}  };  

iqueryable custs

= db

.customers;  

expression expr

= expression

.call(typeof(queryable), "where",  

new type , custs.expression, pred);  

iqueryable<

customer

>

q

= db

.customers.asqueryable().  

provider.createquery<

customer

>

(expr); 

log屬性用於將sql查詢或命令列印到textreader。此方法對了解 linq to sql 功能和除錯特定的問題可能很有用。

下面的示例使用log屬性在sql**執行前在控制台視窗中顯示此**。我們可以將此屬性與查詢、插入、更新和刪除命令一起使用。

//關閉日誌功能  

= null

;  

//使用日誌功能:日誌輸出到控制台視窗  

db.log

= console

.out;  

var q

= from

c in db.customers  

where c.city

== "london"  

select c;  

//日誌輸出到檔案  

streamwriter sw

= new

db.log

= sw

;  

var q

= from

c in db.customers  

where c.city

== "london"  

select c;  

sw.close(); 

Linq 查詢 與方法呼叫

通常,使用linq查詢時需要乙個實現iqueryable的查詢物件 public class dataa iqueryable之後通過 var q from c in new dataawhere c 0 select new 進行查詢,使用iqueryprovider 收集使用者輸入的表示式進行處...

Linq呼叫資料訪問服務

linq有很多值得學習的地方,這裡我們主要介紹linq呼叫資料訪問服務,包括介紹admin.cs 修改成等方面。linq呼叫資料訪問服務 public partial class default system.web.ui.pag protected void btn sendmessage cli...

LINQ聖經 《LINQ實戰》

本書作者是 linq 社群中的重要成員,他們在書中展示了這一技術的精髓 快去享受這一盛宴吧。matt warren 微軟主架構師,linq 之父 linq 方面的傑作!深入 全面 客觀,令人欲罷不能。強烈推薦!patrick smacchia 微軟 mvp c 和 net 2.0 實戰 作者 微軟 ...