为什么 IQueryable.FirstorDefault() 每次针对一种对象类型而不是另一种对象类型返回相同的引用?

发布于 2024-11-03 19:42:30 字数 653 浏览 0 评论 0原文

我在使用 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() 调用每次都会计算为 true...有什么想法这是可能的吗? (注意:我已检查并验证 a1、a2、p1 和 p2 均评估为各自的类且不为空)。

I came across this while playing with LINQ to SQL and can't seem to see it in a light that makes any sense. I have an IQueryable as:

var personnel = from p in dc.Resources select p;
var p1 = personnel.FirstOrDefault();
var p2 = personnel.FirstOrDefault();
objec.ReferenceEquals(p1,p2);

the above ReferenceEquals() call evalutates to false every time (as I would think it should since a new T-SQL call is generated for each call to FirstOrDefault()). However, I also have another IQueryable (different table in same database) as:

var accounts = from a in dc.Accounts select a;
var a1 = accounts.FirstOrDefault();
var a2 = accounts.FirstOrDefault();
object.ReferenceEquals(a1,a2);

this time the ReferenceEquals() call evalutes to true every time...any ideas how this is possible? (Note: I have checked to verify that a1,a2,p1 & p2 all evaluate to their respective classes and not null).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧伤慢歌 2024-11-10 19:42:30

尽管每次调用 FirstOrDefault 时 LINQ to SQL 都会执行查询,但对于从数据库返回的每个对象,LINQ to SQL 都会检查它是否在缓存中,如果在,则会丢弃获取的数据并简单地返回缓存的对象。

Although LINQ to SQL will execute the query every time you call FirstOrDefault, for every object returned from the database, LINQ to SQL will check if it is in the cache, and if it is, it will throw away the fetched data and simply returns the cached object.

嘿咻 2024-11-10 19:42:30

第一个实体中一定有某些东西阻止 DC 向您提供缓存版本。我希望第二个例子是您经常看到的行为;当您请求一个它已经加载的对象时,DC 会识别出来,并且会在可能的情况下简单地为您提供相同的引用。

There must be something with the first entity which is preventing the DC from giving you the cached version. I would expect the second example to be the behavior you would often see; the DC will recognize when you are requesting an object that it has already loaded, and will simply hand you the same reference when it can.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文