我有一个方法,给我一个对象列表,例如
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指令之外
不,该using声明不会一直存在于您的查询实现中.
除非调用Person已经返回一个完全物化的集合,这不太可能并且不典型.
会发生什么是以下情况:
您调用Person上下文的属性,并收集LINQ查询
可能这将返回一个尚未执行的延迟查询
FirstOrDefault查询,尝试执行它此时,可能的结果是代码崩溃,因为您尝试使用已处置的上下文执行查询.