问题描述
使用下面的linq语句时出现堆栈溢出异常
var dbUsers = context.users.Where(ad => userIDList.Any(up => up == ad.UserID)).ToList();
用户使用实体框架从数据库中获得用户的列表。 userIDList是字符串格式的用户标识列表。 我正在尝试从数据库中获取与列表userIDList中具有相同userid的所有用户,以便对这些用户进行更改。 列表很大(23k)。可能是问题所在吗?
解决方法
列表很大(23k)。可能是问题所在吗?
这绝对是一个问题。 SQL不支持这么大的查询,更糟糕的事实是EF试图为这样的大列表创建谓词并失败。 另外,该查询也应简化
var dbUsers = context.users
.Where(ad => userIDList.Contains(ad.UserID)).ToList();
但是我认为这不会有帮助,只有临时表可以在这种情况下提供帮助。
由于我不知道其他解决方案,因此在这里使用linq2db.EntityFrameworkCore扩展名(免责声明,我是此扩展名的作者)在此留下示例,您可以在所有其他解决方案均告失败时返回。
class IdHolder
{
[Column] public int Id;
}
...
var ids = userIDList.Select(id => new IdHolder { Id = id });
using (var l2db = context.CreateLinqToDBConnection())
using (var temp = l2db.CreateTemporaryTable("#UserIds",ids))
{
var query =
from t in temp
join u in context.users on t.Id equals u.UserId
select u;
var dbUsers = query.ToList();
}