【问题标题】:Stackoverflow Exception while using a Linq [closed]使用 Linq 时出现 Stackoverflow 异常 [关闭]
【发布时间】:2021-01-30 09:49:29
【问题描述】:

我在使用下面的 linq 语句时遇到堆栈溢出异常

var dbUsers = context.users.Where(ad => userIDList.Any(up => up == ad.UserID)).ToList();

users 从数据库中使用实体框架的用户列表。 userIDList 是字符串格式的用户 ID 列表。 我正在尝试从数据库中获取与列表 userIDList 具有相同用户 ID 的所有用户,以便我可以对这些用户进行更改。 该列表很大(23k)。会不会是这个问题?

【问题讨论】:

    标签: c# asp.net linq console stack-overflow


    【解决方案1】:

    列表很大 (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();
    }
    

    【讨论】:

    • 是的,大量记录是问题所在。我能够通过将列表分解成更小的块来使其工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多