使用Linq时出现Stackoverflow异常

问题描述

使用下面的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();
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...