【发布时间】:2011-04-25 15:37:31
【问题描述】:
我在使用 LINQ to SQL 时遇到了这个问题,但似乎无法从有任何意义的角度看待它。我有一个 IQueryable 为:
var personnel = from p in dc.Resources select p;
var p1 = personnel.FirstOrDefault();
var p2 = personnel.FirstOrDefault();
objec.ReferenceEquals(p1,p2);
上面的 ReferenceEquals() 调用每次都评估为 false(我认为应该如此,因为每次调用 FirstOrDefault() 都会生成一个新的 T-SQL 调用)。但是,我还有另一个 IQueryable(同一数据库中的不同表):
var accounts = from a in dc.Accounts select a;
var a1 = accounts.FirstOrDefault();
var a2 = accounts.FirstOrDefault();
object.ReferenceEquals(a1,a2);
这一次 ReferenceEquals() 调用每次都评估为真......有什么想法怎么可能? (注意:我已经检查以确认 a1、a2、p1 和 p2 都评估为各自的类而不是 null)。
【问题讨论】:
-
p1 和 p2 是同一人事记录吗? a1和a2是同一个账户记录吗?我的意思是如果返回的记录在对
FirstOrDefault的两次调用中具有相同的主键? -
两个答案中提到的缓存实际上是身份映射模式,它是所有类似 ORM 的工具的关键特性。