gpt4 book ai didi

c# - 为什么我需要 ToList() 来避免处理上下文错误?

转载 作者:太空狗 更新时间:2023-10-29 18:13:13 26 4
gpt4 key购买 nike

我正在编写一些代码来使用 EntityFrameWork 访问数据库。代码是:

public IEnumerable<Rows> GetRows(int id)
{
using (var context = new ApplicationDbContext())
{
var repository = new EntityFrameWorkRepository<int, RowEntity>(context);
//need a ToList() here to prevent disposed dbcontext errors
return repository.GetRowsFromDb(id).ToList();
}
}

GetRowsFromDb() 使用 LINQ 查询数据库并使用 id 过滤结果。

我最初在没有调用 ToList() 的情况下编写了上述方法,但是当我尝试访问返回的 IEnumerable 中的对象时,我会得到一个关于 dbcontext 已经被释放的异常。我不明白上面的代码是如何解决问题的,尽管它确实可以工作。我假设 ToList() 正在深度复制对象,这可能提供了与上下文/数据库所需的分离,但原始对象肯定应该可用吗?

最佳答案

您需要调用 ToListToArray 或枚举 EF 返回数据的其他一些方法的原因是 LINQ 中的查询执行是延迟:在您明确获取数据之前,不会处理数据。当您的方法返回用于获取查询数据的上下文时,它已关闭(您的 using block 会快速处理这种情况),从而导致您看到的异常。

这样做是为了让代码不会花时间处理您不需要的数据。例如,您可以编写在客户端开始读取数据并在中间停止的代码。如果不延迟查询执行,您将花费时间和内存获取查询的“尾部”,结果却将其丢弃。延迟执行让您掌控一切:您可以随时决定要保留哪些数据,或者根据您计划对数据执行的操作将整个集合存入内存。

关于c# - 为什么我需要 ToList() 来避免处理上下文错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27510430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com