【发布时间】:2015-05-15 17:01:14
【问题描述】:
据我在分析 sql 时所知道的,当它调用 group.Users.Remove(user) 时,它会执行一条 sql 语句来检索该组的所有用户。用户是组上的虚拟集合,首先使用 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)group.Users.Remove(user) 的集合中删除和项目时,是否所有组用户都被加载到内存中?
【问题讨论】:
-
You 语句
Context.groups.where...导致IQueryable在您开始循环groupsToRemove时得到解决此外,除非您处理数百万用户,否则解决整个查询不会让您陷入内存问题(并且会比在您遍历集合时解决每个问题稍快)。 -
这目前作为一个hangfire作业运行,异步。速度不像内存限制那么严重。将会有大量用户,数百万,这绝对是一个问题。你是说一旦你开始迭代组,所有的组都会被加载到内存中?
-
修改了评论,让所有用户都被拉回记忆——这可能会让一些人感到困惑
-
我认为不是。它只是通过主键删除用户。但是您可以轻松调试它。 :)
-
调试有时会强制它将所有项目加载到内存中,所以我不能确定它在不处于调试模式时的行为方式是否相同。
标签: c# ef-code-first out-of-memory entity-framework-6