使用声明的范围

Byy*_*yyo 1 c# using

我有一个方法,给我一个对象列表,例如

public IEnumerable<Person> GetPerson()
{
    using (myEntities ctx = new myEntities())
    {
        return ctx.Person.Where(x => x.Age < 50);
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他地方我使用这种方法

public void Main()
{
   var pList = GetPerson();
   pList = pList.Where(x => x.Age < 40);

   Person Item = pList.FirstOrDefault(); //materialization here
}
Run Code Online (Sandbox Code Playgroud)

当我调用FirstOrDefault()select正在进行处理并且正在从数据库中检索数据时.

问题:是否using (myEntities ctx = new myEntities())达到了实现的范围?

一方面它是因为它管理数据库的选择/连接并且在物化时生成 - 另一方面它在方法之外被调用,并且可以在代码中的任何地方 - 在using指令之外

ang*_*son 7

不,该using声明不会一直存在于您的查询实现中.

除非调用Person已经返回一个完全物化的集合,这不太可能并且不典型.

会发生什么是以下情况:

  1. 你构建了上下文
  2. 您调用Person上下文的属性,并收集LINQ查询

    可能这将返回一个尚未执行的延迟查询

  3. 你处理上下文
  4. 您返回您构造的LINQ查询
  5. 您调用FirstOrDefault查询,尝试执行它

此时,可能的结果是代码崩溃,因为您尝试使用已处置的上下文执行查询.