實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 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");
customer cust2 = db.customers.first(c => c.customerid == "
bonap
");
下面的示例中,如果您執行返回資料庫中同一行的不同查詢,則您每次都會收到對記憶體中同一物件的引用。cust1和cust2是同乙個物件引用,但是資料庫查詢了兩次。
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 to SQL語句 16 之物件標識
實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 linq to sql 支援的模型。將資料作為行從資料庫中提取出來時,你不期望表示相同資料的兩行實際上對應於相同的行例項。如果您查詢特定客戶兩次,您將獲得兩行資料。每一行包含相同的資訊。對於物件。你期望在你...
LINQ to SQL語句分析
在向大家詳細介紹linq to sql語句之前,首先讓大家了解下select操作形式,分別為指定型別形式 過濾型別形式 shaped型別形式。這篇開始我們繼續說linq to sql語句,目的讓大家從語句的角度了解linq,linq包括linq to objects linq to datasets...
LINQ to SQL語句 18 之運算子轉換
運算子轉換1.asenumerable 將型別轉換為泛型 ienumerable 使用 asenumerable可返回型別化為泛型 ienumerable 的引數。在 此示例中,linq to sql 使用預設泛型 query 會嘗試將查詢轉換為 sql 並在伺服器上執行。但 where 子句引用使...