Aar*_*ron 15 c# linq datacontext linq-to-sql
我正在使用ASP.NET 4.0.
我有以下代码返回错误"无法访问已处置的对象.对象名称:'Dispose之后访问的DataContext'."
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
IEnumerable<BatchHeader> headers = (from h in context.BatchHeaders
select h);
return headers;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将其更改为:
public IEnumerable<BatchHeader> GetHeaders()
{
using(NSFChecksDataContext context = DataContext)
{
return context.BatchHeaders.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
它会工作正常.我正在使用此方法填充RadGrid.任何人都可以解释为什么第二种方法可行但不是第一种方法?
谢谢.
jas*_*son 16
第一个不起作用,因为当方法返回时,在using块中实例化的数据上下文被释放.但是,IEnumerable<BatchHeader>返回的是懒惰的评估,并且需要此数据上下文才能生成以枚举其结果.
你可以这样做:
public IEnumerable<BatchHeader> GetHeaders() {
using(NSFChecksDataContext context = DataContext) {
foreach(var header in context.BatchHeaders) {
yield return header;
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个块起作用,因为在处理数据上下文之前,查询结果被枚举并存储在内存中.在那之后,不再需要数据上下文.但是,使用像第二个块一样的代码时要小心; 如果BatchHeaders表很大,你只需将它全部拉入内存.
现在,这是我的答案中最严重的部分:我绝对不能看到实例化数据上下文执行的查询.我想知道并控制何时使用我的数据上下文.
| 归档时间: |
|
| 查看次数: |
19003 次 |
| 最近记录: |