2015-05-15 33 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',當您開始循環時將會解決此外,除非您處理數百萬用戶,否則解決整個查詢不會讓你陷入內存問題(並且會比在循環集合時解析每個問題稍快)。 –

+0

這是當前正在運行的異步作業。速度並不像內存約束那麼重要。將有大量的用戶,數百萬,這絕對是一個問題。你是說,只要你開始迭代組,所有的組都加載到內存中? –

+0

修改了評論是做所有用戶都拉回到內存 - 可能困惑了一些人 –

回答

2

做所有users.Groups獲取加載到內存當從集合中刪除和項目在這裏user.Groups.Remove(組)?

是的,我認爲調用group.Users負載的所有用戶。調用context.Users(或context.Groups)將返回IQueryable(因爲UsersGroupsDbSets),而groups.Users大概是一個ICollection<User>。所以(假設你已經啓用延遲加載等),當你訪問它時,它將被填充。

+0

我想了很多...謝謝! –