2015-05-15 2 views
3

Из того, что я могу сказать при профилировании 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)?

+0

Вывод 'Context.groups.where ...' приводит к 'IQueryable', который будет разрешаться при запуске цикла над' groupsToRemove'. Кроме того, если вы не имеете дело с миллионами пользователей, весь запрос не собирается запускать вас в проблему с памятью (и будет немного быстрее, чем разрешать каждый из них, когда вы зацикливаете на коллекцию). –

+0

В настоящее время это выполняется как работа с огнем, асинхронно. Скорость - это не столько проблема, сколько ограничение памяти. Будет большое количество пользователей, миллионы, и это, безусловно, может быть проблемой. Вы говорите, что как только вы начинаете итерацию через группы, все группы загружаются в память? –

+0

изменил комментарий, чтобы все пользователи были втянуты обратно в память - возможно, смутили некоторые люди –

ответ

2

do all the users.Groups загружаются в память при удалении и элемент из коллекции здесь user.Groups.Remove (group)?

Да, я думаю, что ссылающихся group.Usersбы нагрузки всех пользователей. Вызов context.Users (или context.Groups) будет возвращать IQueryable (потому что Users и Groups являются DbSets), в то время как groups.Users предположительно ICollection<User>. Таким образом (если у вас включена ленивая загрузка и т. Д.), Она будет заполнена при доступе к ней.

+0

Я понял, как много ... спасибо! –

Смежные вопросы