处理后访问DataContext

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表很大,你只需将它全部拉入内存.

现在,这是我的答案中最严重的部分:我绝对不能看到实例化数据上下文执行的查询.我想知道并控制何时使用我的数据上下文.

  • `我绝对不能忍受查看实例化数据上下文的查询.我想知道并控制何时使用我的数据上下文. - 为什么? (11认同)
  • 杰森,你的回答确实纠正了我的问题.你能否详细说明你所说的你不能忍受并解释为什么你不能忍受它?我想学习好的做法...... (3认同)