Почему IQueryable <T>.FirstorDefault () каждый раз возвращает одну и ту же ссылку одного типа объекта, а не другого? - PullRequest
0 голосов
/ 25 апреля 2011

Я сталкивался с этим во время игры с 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 () каждый раз оценивается как ложный (как мне кажется, так должно быть, поскольку новый вызов T-SQL генерируется для каждого вызова FirstOrDefault ()). Тем не менее, у меня также есть другой 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 оценивали свои соответствующие классы, а не ноль).

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Хотя LINQ to SQL будет выполнять запрос каждый раз, когда вы вызываете FirstOrDefault, для каждого объекта, возвращенного из базы данных, LINQ to SQL проверит, находится ли он в кэше, и, если это так, он выбросит извлеченные данные. данные и просто возвращает кешированный объект.

1 голос
/ 25 апреля 2011

Должно быть что-то с первой сущностью, которая мешает DC предоставить вам кэшированную версию. Я ожидал бы, что вторым примером будет поведение, которое вы часто видите; DC распознает, когда вы запрашиваете объект, который он уже загрузил, и просто выдаст вам ту же ссылку, когда сможет.

...