Ответ 1
Find
вызывает DetectChanges
внутренне, SingleOrDefault
(или вообще любой запрос) нет. DetectChanges
является дорогостоящей операцией, поэтому причина, по которой Find
работает медленнее (но может стать быстрее, если объект уже загружен в контекст, потому что Find
не будет запускать запрос, а просто возвращает загруженный объект).
Если вы хотите использовать Find
для большого количества объектов - например, в цикле - вы можете отключить автоматическое обнаружение изменений так (не можете записать его в VB, поэтому пример С#):
try
{
context.Configuration.AutoDetectChangesEnabled = false;
foreach (var id in someIdCollection)
{
var competitor = context.Competitors.Find(id);
// ...
}
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
Теперь Find
не будет вызывать DetectChanges
с каждым вызовом, и он должен быть таким же быстрым, как SingleOrDefault
(и быстрее, если объект уже привязан к контексту).
Автоматическое обнаружение изменений является сложным и несколько загадочным предметом. Подробное обсуждение можно найти в этой серии из четырех частей:
(Ссылка на часть 1, ссылки на части 2, 3 и 4 находятся в начале этой статьи)
http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/