我在使用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()调用每次evalutates为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和amp; p2都评估为各自的类而不是null。)
答案 0 :(得分:1)
第一个实体必须存在阻止DC为您提供缓存版本的内容。我希望第二个例子是经常看到的行为;当您请求已经加载的对象时,DC将识别它,并且只有在可能的情况下才会向您提供相同的参考。
答案 1 :(得分:1)
虽然LINQ to SQL将在每次调用FirstOrDefault
时执行查询,但对于从数据库返回的每个对象,LINQ to SQL将检查它是否在缓存中,如果是,它将丢弃获取的数据,只返回缓存的对象。