Из того, что я могу сказать при профилировании sql, он выполняет оператор sql для извлечения всех пользователей для группы при вызове group.Users.Remove(user)
. Пользователи представляют собой виртуальную коллекцию в группе, сначала используя код Entity Framework 6.Удаление/добавление из использования памяти виртуальных коллекций
var usersToRemove = Context.users.Where(u=>someListOfIds.Contains(u.Id)); //might only be a few users
foreach(var group in Context.groups)
{
foreach(var user in usersToRemove.Where(u=>u.groupId == group.Id)){
group.Users.Remove(user);//group.Users might have millions of users, do all users get pulled back into memory at this point?
}
}
Мой вопрос, делать все группы пользователей загружаются в память при удалении и элемент из коллекции здесь group.Users.Remove(user)
?
Вывод 'Context.groups.where ...' приводит к 'IQueryable', который будет разрешаться при запуске цикла над' groupsToRemove'. Кроме того, если вы не имеете дело с миллионами пользователей, весь запрос не собирается запускать вас в проблему с памятью (и будет немного быстрее, чем разрешать каждый из них, когда вы зацикливаете на коллекцию). –
В настоящее время это выполняется как работа с огнем, асинхронно. Скорость - это не столько проблема, сколько ограничение памяти. Будет большое количество пользователей, миллионы, и это, безусловно, может быть проблемой. Вы говорите, что как только вы начинаете итерацию через группы, все группы загружаются в память? –
изменил комментарий, чтобы все пользователи были втянуты обратно в память - возможно, смутили некоторые люди –