實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 linq to sql 支援的模型。將資料作為行從資料庫中提取出來時,你不期望表示相同資料的兩行實際上對應於相同的行例項。如果您查詢特定客戶兩次,您將獲得兩行資料。每一行包含相同的資訊。
對於物件。你期望在你反覆向 datacontext 索取相同的資訊時,它實際上會為你提供同一物件例項。你將它們設計為層次結構或關係圖。你希望像檢索實物一樣檢索它們,而不希望僅僅因為你多次索要同一內容而收到大量的複製例項。
在 linq to sql 中,datacontext 管理物件標識。只要你從資料庫中檢索新行,該行就會由其主鍵記錄到標識表中,並且會建立乙個新的物件。只要您檢索該行,就會將原始物件例項傳遞歸應用程式。通過這種方式,datacontext 將資料庫看到的標識(即主鍵)的概念轉換成相應語言看到的標識(即例項)的概念。應用程式只看到處於第一次檢索時的狀態的物件。新資料如果不同,則會被丟棄。
linq to sql 使用此方法來管理本地物件的完整性,以支援開放式更新。由於在最初建立物件後唯一發生的更改是由應用程式做出的,因此應用程式的意向是很明確的。如果在中間階段外部某一方做了更改,則在呼叫 submitchanges() 時會識別出這些更改。
以上來自msdn,的確,看了有點「正規」,下面我用兩個例子說明一下。
在第乙個示例中,如果我們執行同一查詢兩次,則每次都會收到對記憶體中同一物件的引用。很明顯,cust1和cust2是同乙個物件引用。
customer cust1 = db.customers.first(c => c.customerid == "bonap");下面的示例中,如果您執行返回資料庫中同一行的不同查詢,則您每次都會收到對記憶體中同一物件的引用。cust1和cust2是同乙個物件引用,但是資料庫查詢了兩次。customer cust2 = db.customers.first(c => c.customerid == "bonap");
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;
本文摘自:
LINQ之物件標識
實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 linq to sql 支援的模型。將資料作為行從資料庫中提取出來時,你不期望表示相同資料的兩行實際上對應於相同的行例項。如果您查詢特定客戶兩次,您將獲得兩行資料。每一行包含相同的資訊。對於物件。你期望在你...
LINQ之物件載入
在查詢某物件時,實際上你只查詢該物件。不會同時自動獲取這個物件。這就是延遲載入。例如,您可能需要檢視客戶資料和訂單資料。你最初不一定需要檢索與每個客戶有關的所有訂單資料。其優點是你可以使用延遲載入將額外資訊的檢索操作延遲到你確實需要檢索它們時再進行。請看下面的示例 檢索出來customerid,就根...
LINQ to SQL語句 16 之物件標識
實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 linq to sql 支援的模型。將資料作為行從資料庫中提取出來時,你不期望表示相同資料的兩行實際上對應於相同的行例項。如果您查詢特定客戶兩次,您將獲得兩行資料。每一行包含相同的資訊。對於物件。你期望在你...