• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > net编程 >

LINQ那些事儿(6)-对象生命周期管理

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-06-27点击:

 为了实现从”LINQ那些事”(1)-(5)中介绍的查询特性,在从数据库获取数据至返回给用户之间,除了O/R Mapping外,LINQ2SQL内建了对象标识缓存和跟踪等服务。本文无意讨论这些服务实现的细节,但是稍微了解这些服务有助于我们更有效的使用LINQ,并且为自己编写LINQ扩展提供参考。

对象标识缓存(identity caching)

让我们来看看对象标识缓存(identity caching)的第一个好处:

01 var context = GenerateContext();
02 context.Log = Console.Out;
03 var query1 =
04     (from c in context.Customers
05      select c).Take(100);
06
07 var watch = new Stopwatch();
08 watch.Start();
09 query1.ToList();
10 watch.Stop();
11 watch.ElapsedMilliseconds.Dump();
12
13 watch.Reset();
14 watch.Start();
15 query1.ToList();
16 watch.Stop();
17 watch.ElapsedMilliseconds.Dump();

查询Northwnd的Customers表的100条记录,两处的query1.ToList()都执行了两桶的数据库查询操作,但是两处的时间有差别。看看输出结果:

01 SELECT TOP (100) [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0]
02 .[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode],
03 [t0].[Country], [t0].[Phone], [t0].[Fax], [t0].[CustomerGuid]
04 FROM [dbo].[Customers] AS [t0]
05 -- Context: SqlProvider(Sql2008) Model: MappedMetaModel Build: 3.5.30729.1
06
07 1058
08 SELECT TOP (100) [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0]
09 .[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode],
10 [t0].[Country], [t0].[Phone], [t0].[Fax], [t0].[CustomerGuid]
11 FROM [dbo].[Customers] AS [t0]
12 -- Context: SqlProvider(Sql2008) Model: MappedMetaModel Build: 3.5.30729.1
13
14 3

 

第一次查询用了1058毫秒,而第二次查询只花了3毫秒!

这样的情况的前提是发生在同一个DataContext对象上的查询。当从数据库查询返回后,LINQ需要做O/R mapper,这时会先检查缓存中PrimaryKey相同的对象是否已经存在,如果已经存在,则不再对该条数据做映射,避免了重复映射。而作为 identity caching的唯一标识就是Primary Key,这就是定义enitity class时必须定义IsPrimaryKey的Column的原因之一。

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1170734538@qq.com ,  QQ