LINQ之物件載入

2021-05-22 23:31:15 字數 3133 閱讀 4060

在查詢某物件時,實際上你只查詢該物件。不會同時自動獲取這個物件。這就是延遲載入。

例如,您可能需要檢視客戶資料和訂單資料。你最初不一定需要檢索與每個客戶有關的所有訂單資料。其優點是你可以使用延遲載入將額外資訊的檢索操作延遲到你確實需要檢索它們時再進行。請看下面的示例:檢索出來customerid,就根據這個id查詢出orderid。

var custs =

from c in db.customers

where c.city == "sao paulo"

select c;

//上面的查詢句法不會導致語句立即執行,僅僅是乙個描述性的語句,

只有需要的時候才會執行它

foreach (var cust in custs)

}

你如果想要同時查詢出一些物件的集合的方法。linq to sql 提供了dataloadoptions用於立即載入物件。方法包括:

loadwith 方法,用於立即載入與主目標相關的資料。

associatewith 方法,用於篩選為特定關係檢索到的物件。

使用 loadwith方法指定應同時檢索與主目標相關的哪些資料。例如,如果你知道你需要有關客戶的訂單的資訊,則可以使用 loadwith 來確保在檢索客戶資訊的同時檢索訂單資訊。使用此方法可僅訪問一次資料庫,但同時獲取兩組資訊。

在下面的示例中,我們通過設定dataloadoptions,來指示datacontext在載入customers的同時把對應的orders一起載入,在執行查詢時會檢索位於sao paulo的所有 customers 的所有 orders。這樣一來,連續訪問 customer 物件的 orders 屬性不會觸發新的資料庫查詢。在執行時生成的sql語句使用了左連線。

northwinddatacontext db = new 

northwinddatacontext();

dataloadoptions ds = new

dataloadoptions();

ds.loadwith(p => p.orders);

db.loadoptions = ds;

var custs = (

from c in db2.customers

where c.city == "sao paulo"

select c);

foreach (var cust in custs)

has an orderid .",

cust.customerid,

ord.orderid);

}}

使用 associatewith 方法指定子查詢以限制檢索的資料量。

在下面的示例中,associatewith 方法將檢索的 orders 限制為當天尚未裝運的那些 orders。如果沒有此方法,則會檢索所有 orders,即使只需要乙個子集。但是生成sql語句會發現生成了很多sql語句。

northwinddatacontext db2 = new 

northwinddatacontext();

dataloadoptions ds = new

dataloadoptions();

ds.associatewith

(p => p.orders.where(o => o.shipvia > 1));

db2.loadoptions = ds;

var custs =

from c in db2.customers

where c.city == "london"

select c;

foreach (var cust in custs)

}}

這個例子說明:使用loadwith方法來確保在檢索客戶資訊的同時檢索訂單資訊,在檢索訂單資訊的同時檢索訂單詳細資訊, 僅僅訪問一次資料庫。即可以在乙個查詢中檢索許多物件。使用associate with方法來限制訂單詳細資訊的排序規則。

northwinddatacontext db2 = new 

northwinddatacontext();

dataloadoptions ds = new

dataloadoptions();

ds.loadwith(p => p.orders);

ds.loadwith(p => p.orderdetails);

ds.associatewith(

p => p.orderdetails.orderby(o => o.quantity));

db2.loadoptions = ds;

var custs = (

from c in db2.customers

where c.city == "london"

select c);

foreach (var cust in custs)

}}

這個例子在category類裡提供了乙個loadproducts分部方法。當產品的類別被載入的時候,就直接優先呼叫了loadproducts方法來查詢沒有貨源的產品。

private 

ienumerable

loadproducts(category category)

執行下面的查詢時,利用上面方法返回的資料進行下面的操作:

northwinddatacontext db2 = new 

northwinddatacontext();

dataloadoptions ds = new

dataloadoptions();

ds.loadwith(p => p.products);

db2.loadoptions = ds;

var q = (

from c in db2.categories

where c.categoryid < 3

select c);

foreach (var cat in q)

}

語句描述:重寫 category 類中的分部方法 loadproducts。載入某種類別的產品時,呼叫 loadproducts 以載入此類別中未停產的產品。

本文摘自:http://www.cnblogs.com/lyj/archive/2008/03/10/1098828.html

Linq之延遲載入特性

寫在前面 系列文章 延遲載入 總結上篇文章介紹了linq中常見的幾個關鍵字,並列舉了幾個例子,算是對linq如何使用有了初步了解。上篇文章中也提到了,能夠使用linq的場合有乙個要求 實現ienumerable泛型介面,或者型別相容 可以通過cast方法轉換,比如arraylist linq之lam...

Linq之延遲載入特性

寫在前面 系列文章 延遲載入 總結上篇文章介紹了linq中常見的幾個關鍵字,並列舉了幾個例子,算是對linq如何使用有了初步了解。上篇文章中也提到了,能夠使用linq的場合有乙個要求 實現ienumerable泛型介面,或者型別相容 可以通過cast方法轉換,比如arraylist linq之lam...

LINQ之物件標識

實際上,通常我們是將資料從資料庫中提取出來放入另一層中,應用程式在該層對資料進行處理。這就是 linq to sql 支援的模型。將資料作為行從資料庫中提取出來時,你不期望表示相同資料的兩行實際上對應於相同的行例項。如果您查詢特定客戶兩次,您將獲得兩行資料。每一行包含相同的資訊。對於物件。你期望在你...