C# 使用Linq时出现Stackoverflow异常
我在使用下面的linq语句时遇到堆栈溢出异常C# 使用Linq时出现Stackoverflow异常,c#,asp.net,linq,console,stack-overflow,C#,Asp.net,Linq,Console,Stack Overflow,我在使用下面的linq语句时遇到堆栈溢出异常 var dbUsers=context.users.Where(ad=>userIDList.Any(up=>up==ad.UserID)).ToList() 用户使用实体框架从数据库中获取用户列表。 userIDList是字符串格式的userid列表。 我试图从数据库中获取与列表userIDList中的用户ID相同的所有用户,以便对这些用户进行更改。 列表很大(23k)。这可能是问题所在吗 列表很大(23k)。这可能是问题所在吗 这绝对是一个问题。
var dbUsers=context.users.Where(ad=>userIDList.Any(up=>up==ad.UserID)).ToList()代码>
用户使用实体框架从数据库中获取用户列表。
userIDList是字符串格式的userid列表。
我试图从数据库中获取与列表userIDList中的用户ID相同的所有用户,以便对这些用户进行更改。
列表很大(23k)。这可能是问题所在吗
列表很大(23k)。这可能是问题所在吗
这绝对是一个问题。SQL不支持如此大的查询,更糟糕的是,EF试图为如此大的列表创建谓词,但失败了。
此外,还应简化此查询
var dbUsers = context.users
.Where(ad => userIDList.Contains(ad.UserID)).ToList();
但我不认为这会有什么帮助,在这种情况下,只有临时桌子能帮上忙
因为我不知道其他的解决方案,所以在这里留下使用扩展的示例(免责声明我是这个扩展的作者),当所有其他解决方案都失败时,您可以返回
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();
}
是的,大量的记录是问题所在。通过将列表分解成更小的块,我能够使它工作。