商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

LINQ to SQL - Delay Loaded

作者:ITPUB论坛  2008-01-17

【IT168技术文档】

  对 ORM 而言,延迟加载(也叫 Lazy Loading)是必须的,毕竟当我们只是获取用户基本信息时,总不能动不动就返回大段的用户个人简介不是。

  在 VS 2008 O/R Designer 中,很容易找到 Delay Loaded 的设置。
 
  只是当我在自动生成的代码中找寻这个设置时,着实迷糊了半天。基于惯性思维,我查看了几乎所有的特性(Attribute)声明,却一无所获,最后才发觉这个家伙竟然是这个样子。
  Delay Loaded = False
[Table(Name="dbo.[User]")] public partial class User : INotifyPropertyChanging, INotifyPropertyChanged { private string _Job; }
  Delay Loaded = True
[Table(Name="dbo.[User]")] public partial class User : INotifyPropertyChanging, INotifyPropertyChanged { private System.Data.Linq.Link<string> _Job; }
  习惯害人~~~~ 接下来我们测试一下延迟加载的作用。
using (DataClasses1DataContext context = new DataClasses1DataContext()) { 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 输出
SELECT TOP 1 [t0].[Id], [t0].[Name], [t0].[Age], [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 user1 job
  Delay Loaded = True 输出
SELECT TOP 1 [t0].[Id], [t0].[Name], [t0].[Age] 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 失效,不再进行延迟字段载入操作。
1
【内容导航】
第1页: 概述
©版权所有。未经许可,不得转载。
[责任编辑:nancy]