[转自雨痕]LINQ to SQL - Delay Loaded
原文: http://www.rainsts.net/article.asp?id=550
?
對 ORM 而言,延遲加載(也叫 Lazy Loading)是必須的,畢竟當我們只是獲取用戶基本信息時,總不能動不動就返回大段的用戶個人簡介不是。
在 VS 2008 O/R Designer 中,很容易找到 Delay Loaded 的設置。
只是當我在自動生成的代碼中找尋這個設置時,著實迷糊了半天。基于慣性思維,我查看了幾乎所有的特性(Attribute)聲明,卻一無所獲,最后才發覺這個家伙竟然是這個樣子。
Delay Loaded = False
public partial class User : INotifyPropertyChanging, INotifyPropertyChanged
{
??private string _Job;
}
Delay Loaded = True
public partial class User : INotifyPropertyChanging, INotifyPropertyChanged
{
??private System.Data.Linq.Link<string> _Job;
}
習慣害人~~~~ 接下來我們測試一下延遲加載的作用。
{
??context.Log = Console.Out;
??var user = (from u in context.Users where u.Name == "user1" select u).FirstOrDefault();
??Console.WriteLine(user.Name);
??Console.WriteLine(user.Job);
}
Delay Loaded = False 輸出
FROM [dbo].[User] AS [t0]
WHERE [t0].[Name] = @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [user1]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
user1
job
Delay Loaded = True 輸出
FROM [dbo].[User] AS [t0]
WHERE [t0].[Name] = @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [user1]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
user1
SELECT [t0].[Job]
FROM [dbo].[User] AS [t0]
WHERE [t0].[Name] = @p0
-- @p0: Input String (Size = 5; Prec = 0; Scale = 0) [user1]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20706.1
job
當設置延遲加載后,查詢 User 時并沒有返回 Job 字段值,只有當訪問該屬性時才進行了第二次 SQL 操作,很顯然這就是我們所需要的。延遲加載雖然很有用,但并不表示我們應該將 n 多的 Column 設置成 Delay Loaded = true,或許你要做的是創建另外一個 One-to-One / Base-to-Detail。
注意!當 "context.DeferredLoadingEnabled = false" 或 "context.ObjectTrackingEnabled = false" 時,都會導致 Delay Loaded 失效,不再進行延遲字段載入操作。
總結
以上是生活随笔為你收集整理的[转自雨痕]LINQ to SQL - Delay Loaded的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物流英语与计算机操作,物流英语与计算机模
- 下一篇: 5G第一英里的“遭遇战”