gpt4 book ai didi

c# - 处理后访问的 DataContext

转载 作者:可可西里 更新时间:2023-11-01 07:56:14 24 4
gpt4 key购买 nike

我正在使用 ASP.NET 4.0。

我得到以下代码,返回错误“无法访问已处置的对象。对象名称:'DataContext 在 Dispose 之后访问。'。"

 public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
IEnumerable<BatchHeader> headers = (from h in context.BatchHeaders
select h);
return headers;
}
}

如果我将其更改为:

public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
return context.BatchHeaders.ToList();
}
}

它会很好地工作。我正在使用此方法来填充 RadGrid。谁能解释为什么第二种方法有效而第一种方法无效?

谢谢。

最佳答案

第一个不起作用,因为当该方法返回在 using 中实例化的数据上下文时 block 被处置。然而,IEnumerable<BatchHeader>返回的是延迟评估的,需要此数据上下文处于事件状态以枚举其结果。

你可以这样做:

 public IEnumerable<BatchHeader> GetHeaders() {
using(NSFChecksDataContext context = DataContext) {
foreach(var header in context.BatchHeaders) {
yield return header;
}
}
}

第二个 block 之所以有效,是因为在处理数据上下文之前查询结果被枚举并存储在内存中。在那之后,就不再需要数据上下文了。但是,在使用像第二个 block 这样的代码时要小心;如果BatchHeaders表很大,您只需将其全部拉入内存即可。

现在,这是我回答中最严肃的部分:我绝对无法忍受看到实例化数据上下文来执行的查询。我想知道并控制何时使用我的数据上下文。

关于c# - 处理后访问的 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328594/

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