为什么IQueryable <t> .FirstorDefault()每次返回一个对象类型而不是另一个对象类型的引用?</t>

时间:2011-04-25 15:37:31

标签: linq-to-sql iqueryable

我在使用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。)

2 个答案:

答案 0 :(得分:1)

第一个实体必须存在阻止DC为您提供缓存版本的内容。我希望第二个例子是经常看到的行为;当您请求已经加载的对象时,DC将识别它,并且只有在可能的情况下才会向您提供相同的参考。

答案 1 :(得分:1)

虽然LINQ to SQL将在每次调用FirstOrDefault时执行查询,但对于从数据库返回的每个对象,LINQ to SQL将检查它是否在缓存中,如果是,它将丢弃获取的数据,只返回缓存的对象。