2016-03-04 82 views
1

我有一个方法给了我一个对象列表例如使用语句的范围

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())的范围是否达到物化?

一方面,它的理由是因为它管理数据库的选择/连接,并且在实现中生成 - 另一方面,它在方法外调用,可能在代码中的任何地方 - 在使用之外指令

+4

我已经编辑你的问题的标题,因为这是一个使用*语句*,而不是使用*指令*。 –

+0

您是否尝试执行该代码,它工作? –

回答

7

不,using声明并不能完全实现查询的实现。

除非调用Person已经返回完全物化集合,这是不太可能的,也不是典型的。

会发生什么情况如下:

  1. 您构建上下文
  2. 你叫上下文的Person属性,掖在LINQ查询

    可能的,这将返回延期查询,尚未执行

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

在这一点上可能的结果是,该代码崩溃,因为你想使用它一直是上下文中执行查询处置。

+0

好的谢谢你的详细解释 – Byyo

1

下面是如何使用工作:

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(); 
    } 
}