使用语句的范围
问题描述:
我有一个方法给了我一个对象列表例如使用语句的范围
public IEnumerable<Person> GetPerson()
{
using (myEntities ctx = new myEntities())
{
return ctx.Person.Where(x => x.Age < 50);
}
}
别的地方当我打电话FirstOrDefault()
选择被genereated和数据从数据库中检索我用这个方法
public void Main()
{
var pList = GetPerson();
pList = pList.Where(x => x.Age < 40);
Person Item = pList.FirstOrDefault(); //materialization here
}
。
问题:using (myEntities ctx = new myEntities())
的范围是否达到物化?
一方面,它的理由是因为它管理数据库的选择/连接,并且在实现中生成 - 另一方面,它在方法外调用,可能在代码中的任何地方 - 在使用之外指令
答
不,using
声明并不能完全实现查询的实现。
除非调用Person
已经返回完全物化集合,这是不太可能的,也不是典型的。
会发生什么情况如下:
- 您构建上下文
-
你叫上下文的
Person
属性,掖在LINQ查询可能的,这将返回延期查询,尚未执行
- 您处理的上下文
- 您返回LINQ查询您构建
- 您在查询调用
FirstOrDefault
,试图执行它
在这一点上可能的结果是,该代码崩溃,因为你想使用它一直是上下文中执行查询处置。
+0
好的谢谢你的详细解释 – Byyo
答
下面是如何使用工作:
void Main()
{
Person Item = UsingPerson(ps => ps.Where(x => x.Age < 40).Take(1)).FirstOrDefault();
}
public T[] UsingPerson<T>(Func<IQueryable<Person>, IQueryable<T>> project)
{
using (myEntities ctx = new myEntities())
{
return project(ctx.Person.Where(x => x.Age < 50)).ToArray();
}
}
我已经编辑你的问题的标题,因为这是一个使用*语句*,而不是使用*指令*。 –
您是否尝试执行该代码,它工作? –