"There is already an open DataReader associated with this Command which must be closed first" Entity Framework linq 查询错误

"There is already an open DataReader associated with this Command which must be closed first" error on Entity Framework linq query

我经常(但不总是)收到此错误

There is already an open DataReader associated with this Command which must be closed first

当 运行 GetRecentClients 中显示查询时。在我查找之后,我发现它必须在同时打开 2 个连接的情况下执行某些操作,打开 MARS 应该会有所帮助,但我宁愿不这样做。

是否有其他解决方法,第二个连接究竟来自哪里?没有包含或类似的事情发生,会议是一个非常简单的实体,只有基本类型属性。

public static async Task<RecentClientsModel> GetRecentClients(int managerId, IUnitOfWork unitOfWork)
{
    var recentViews = (await unitOfWork.GetRepository<Meeting>().Get(
        source => source
            .Where(a => a.Type == StatusType.Viewed && a.ManagerId == managerId)                    
            .GroupBy(c => c.ClientId)
            .Select(gr => gr.OrderByDescending(g => g.Date).FirstOrDefault())
            .OrderByDescending(a => a.Date)
            .Take(10))).ToArray();
    
    //...
}

public class Meeting
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
    public StatusType Type { get; set; }
    public int? ClientId { get; set; }
    public int? ManagerId { get; set; }
}

public async Task<IEnumerable<T>> Get(Func<IQueryable<T>, IQueryable<T>> queryBuilder)
{
    return await queryBuilder(_context.Set<T>()).ToListAsync();
}

找到这个答案:Entity Framework: There is already an open DataReader associated with this Command

这表明它可能是由于嵌套查询或延迟加载而触发的。听起来解决这个问题的唯一方法是不使用延迟加载或启用 MARS(多个活动结果集)。

在您的情况下,这可能不是实际的第二个连接,而是来自同一连接的另一个结果集。我也想知道这是否可能是由于 ToListAsync().

实际上,现在我再次查看它,可能是查询中间的 gr.OrderByDescending() 调用?这可能是在尝试枚举外部结果集中间的结果集。也许尝试重写查询(甚至不正确)以避免类似的事情,然后看看问题是否消失。