Linq對(duì)象引用簡單介紹
在向大家詳細(xì)介紹Linq對(duì)象引用之前,首先讓大家了解下對(duì)象標(biāo)識(shí),然后全面介紹Linq對(duì)象引用。
對(duì)象標(biāo)識(shí)
◆運(yùn)行庫中的對(duì)象具有唯一標(biāo)識(shí)。引用同一對(duì)象的兩個(gè)變量實(shí)際上是引用此對(duì)象的同一實(shí)例。你更改一個(gè)變量后,可以通過另一個(gè)變量看到這些更改。
◆關(guān)系數(shù)據(jù)庫表中的行不具有唯一標(biāo)識(shí)。由于每一行都具有唯一的主鍵,因此任何兩行都不會(huì)共用同一鍵值。
實(shí)際上,通常我們是將數(shù)據(jù)從數(shù)據(jù)庫中提取出來放入另一層中,應(yīng)用程序在該層對(duì)數(shù)據(jù)進(jìn)行處理。這就是 LINQ to SQL 支持的模型。將數(shù)據(jù)作為行從數(shù)據(jù)庫中提取出來時(shí),你不期望表示相同數(shù)據(jù)的兩行實(shí)際上對(duì)應(yīng)于相同的行實(shí)例。如果您查詢特定客戶兩次,您將獲得兩行數(shù)據(jù)。每一行包含相同的信息。
對(duì)于對(duì)象。你期望在你反復(fù)向 DataContext 索取相同的信息時(shí),它實(shí)際上會(huì)為你提供同一對(duì)象實(shí)例。你將它們設(shè)計(jì)為層次結(jié)構(gòu)或關(guān)系圖。你希望像檢索實(shí)物一樣檢索它們,而不希望僅僅因?yàn)槟愣啻嗡饕粌?nèi)容而收到大量的復(fù)制實(shí)例。
在 LINQ to SQL 中,DataContext 管理對(duì)象標(biāo)識(shí)。只要你從數(shù)據(jù)庫中檢索新行,該行就會(huì)由其主鍵記錄到標(biāo)識(shí)表中,并且會(huì)創(chuàng)建一個(gè)新的對(duì)象。只要您檢索該行,就會(huì)將原始對(duì)象實(shí)例傳遞回應(yīng)用程序。通過這種方式,DataContext 將數(shù)據(jù)庫看到的標(biāo)識(shí)(即主鍵)的概念轉(zhuǎn)換成相應(yīng)語言看到的標(biāo)識(shí)(即實(shí)例)的概念。應(yīng)用程序只看到處于第一次檢索時(shí)的狀態(tài)的對(duì)象。新數(shù)據(jù)如果不同,則會(huì)被丟棄。
LINQ to SQL 使用此方法來管理本地對(duì)象的完整性,以支持開放式更新。由于在最初創(chuàng)建對(duì)象后唯一發(fā)生的更改是由應(yīng)用程序做出的,因此應(yīng)用程序的意向是很明確的。如果在中間階段外部某一方做了更改,則在調(diào)用 SubmitChanges() 時(shí)會(huì)識(shí)別出這些更改。
以上來自MSDN,的確,看了有點(diǎn)“正規(guī)”,下面我用兩個(gè)例子說明一下。
Linq對(duì)象引用
在第一個(gè)示例中,如果我們執(zhí)行同一查詢兩次,則每次都會(huì)收到對(duì)內(nèi)存中同一Linq對(duì)象引用。很明顯,cust1和cust2是同一個(gè)Linq對(duì)象引用。
- Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
- Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");
下面的示例中,如果您執(zhí)行返回?cái)?shù)據(jù)庫中同一行的不同查詢,則您每次都會(huì)收到對(duì)內(nèi)存中同一Linq對(duì)象引用。cust1和cust2是同一個(gè)Linq對(duì)象引用,但是數(shù)據(jù)庫查詢了兩次。
- Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
- Customer cust2 = (
- from o in db.Orders
- where o.Customer.CustomerID == "BONAP"
- select o )
- .First()
- .Customer;
【編輯推薦】