[转自雨痕]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

[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 失效,不再进行延迟字段载入操作。

时间: 2024-12-02 00:28:44

[转自雨痕]LINQ to SQL - Delay Loaded的相关文章

SOA数据访问:使用LINQ To SQL和实体框架实现灵活的数据访问

本文配套源码 本文使用以下技术: LINQ to SQL.ADO.NET实体框架和SOA 目录 创建数据访问层 持久化各个对象 跨服务边界跟踪更改 配置客户端 总结 迄今为止,Microsoft 已面向开发人员发布了两种旨在减少关系数据领域和面向对象的编程之间 的阻抗失谐的产品:LINQ to SQL 和 ADO.NET 实体框架.借助其中任何一种产品,您不必编写大部分探 测代码,即可实现对象持久性.但是,将这些对象关系映射 (ORM) 技术应用到面向服务的应用程序体系 结构为应用程序开发人员带

Linq to SQL对象的增删改

你的程序里,是否到处充斥着这种代码: db.Customers.InsertOnSubmit(customer); db.SubmitChange(); 如果某一天,因为 Customers 表的数据库巨增,需要把它拆成两个表,你是否会胆寒???当然,对于查询,我们可以通过视图来解决.对于插入,或者更新呢?据说,现在的数据库在某些情况下,可以对视图进行数据的更新.插入.但是我们要考虑的是不可以的情况.是不是得每个地方都改呀?对于一个大型的项目,这种改动是很可怕的,某个地方少改了,就糟糕了.不过,

Linq to SQL对象的标识

很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍也是很显浅,按书籍做出来的东西,只能是学生级别的东西,根本拿不出手.他们觉得我有这个能力写好. 从技术能力的角度来说,的确是不存在什么问题,但是,要把一门技术讲精讲透,是花很时间的事情.自己付出了很多,如果不能得到读者的认同,那这个专题写下去也没什么意义了.这个专题不是教你怎么使用Linq to SQL,

测试运行: 使用LINQ测试SQL存储过程

对访问和操作后端 SQL Server 数据库的程序进行测试十分常见.在此类情况中,应用程序基本都是通过使用 SQL 存储过程来与后端数据进行交互的.此时,可将存储过程看作待测试系统的辅助方法:因此也必须像系统中的任何其他模块一样测试它们. 尽管在测试 SQL 存储过程时可使用的方法有很多,但我发现使用 LINQ 可极大地简化测试自动化.在本月的专栏中,我将向您展示如何使用 LINQ(尤其是使用 LINQ to SQL 提供程序)来测试 SQL 存储过程.我将假定您的 C# 和 SQL 技能属于

比较LINQ to SQL Diagram 和Entity Data Model

LINQ to SQL Diagram(DBML)和Entity Data Model(EDMX)都是.Net Framework v3.5 引入的新特性.相信有很多人不清楚它们之间的差异,这里简要分析比较.下面以Northwind 范例数据库进行说明: LINQ to SQL 对象关系图(Object Relational Diagram) Entity Data Model (EDM) 实体数据模型

学Linq to sql(十):分层构架的例子

项目介绍 这节将要把<学Linq to sql (三):增删改>中留言簿的例子修改为使用WCF的多层构架.我们将会建立以下项目: l A,网站项目 WebSite:留言簿表现层 l B,类库项目 Contract:定义数据访问服务的契约 l C,类库项目 Service:定义数据访问服务 l D,类库项目Entity:留言簿实体 l E,控制台项目Host:承载数据访问服务 项目之间的引用如下: l A引用B和D: l B引用D和System.ServiceModel程序集 l C引用B.D.

学Linq to sql(三):增、删、改

示例数据库 字段名 字段类型 允许空 字段说明 ID uniqueidentifier   表主键字段 UserName varchar(50)   留言用户名 PostTime datetime   留言时间 Message varchar(400) √ 留言内容 IsReplied bit   留言是否回复 Reply varchar(400) √ 留言管理员回复 在数据库中创建一个名为GuestBook的数据库,在里面创建一个tbGuestBook的表,结构如上表. 生成实体类 右键点击网

学Linq to sql(一):预备知识

什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xml .Linq to objects.Linq to dataset.Linq to entities等组成了强大的LINQ. 要学好LINQ查询语法,就不得不先理解C# 3.0的一些新特性,下面一一简单介绍. 隐含类型局部变量 var age = 26; var

Linq to SQL加注Data Annotation在Asp.Net MVC2中的应用

一.写作前提 最近正在做一个Asp.Net MVC2的Project,用到了Linq to SQL,但是对于如何在MVC2中使用 Linq to SQL 生成的强类型加注Data Annotation,我们都知道在MVC2中我们可以定义自己的Model,然后给Model 加Data Annotation,从而在View中可以实现完美的Client Validation(这些Data Annotation也我们也可 以去自己定义).但是对于Linq to SQL 生成的强类型,我们有两个问题,第一