C# 使用范围声明

C# 使用范围声明,c#,using,C#,Using,我有一个方法可以给我一个对象列表,例如 public IEnumerable<Person> GetPerson() { using (myEntities ctx = new myEntities()) { return ctx.Person.Where(x => x.Age < 50); } } public IEnumerable GetPerson() { 使用(myEntities ctx=new myEntities(

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

public IEnumerable<Person> GetPerson()
{
    using (myEntities ctx = new myEntities())
    {
        return ctx.Person.Where(x => x.Age < 50);
    }
}
public IEnumerable GetPerson()
{
使用(myEntities ctx=new myEntities())
{
返回ctx.Person.Where(x=>x.Age<50);
}
}
在别的地方我用这种方法

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

   Person Item = pList.FirstOrDefault(); //materialization here
}
public void Main()
{
var pList=GetPerson();
pList=pList.式中(x=>x.年龄<40);
Person Item=pList.FirstOrDefault();//此处具体化
}
当我调用
FirstOrDefault()
时,将生成select并从数据库中检索数据

问题:
使用(myEntities ctx=new myEntities())
的范围是否达到了具体化


一方面,这可能是因为它管理到数据库的select/连接,并在具体化时生成-另一方面,它在方法之外调用,可能在代码中的任何地方-在using指令之外,
using
语句在查询的具体化过程中不会一直存在

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

发生的情况如下:

  • 你可以构建上下文
  • 调用上下文的
    Person
    属性,然后执行LINQ查询

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

  • 您可以处理上下文
  • 返回构建的LINQ查询
  • 您对查询调用
    FirstOrDefault
    ,试图执行它

  • 此时,可能的结果是代码崩溃,因为您试图使用已释放的上下文执行查询。

    否,
    using
    语句在查询的具体化过程中不会一直存在

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

    发生的情况如下:

  • 你可以构建上下文
  • 调用上下文的
    Person
    属性,然后执行LINQ查询

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

  • 您可以处理上下文
  • 返回构建的LINQ查询
  • 您对查询调用
    FirstOrDefault
    ,试图执行它

  • 此时,可能的结果是代码崩溃,因为您试图使用已释放的上下文执行查询。

    以下是如何使使用有效:

    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();
        }
    }
    
    void Main()
    {
    Person项目=使用Person(ps=>ps.Where(x=>x.Age<40.Take(1)).FirstOrDefault();
    }
    公共T[]使用人(Func项目)
    {
    使用(myEntities ctx=new myEntities())
    {
    返回项目(ctx.Person.Where(x=>x.Age<50)).ToArray();
    }
    }
    
    以下是如何使使用有效:

    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();
        }
    }
    
    void Main()
    {
    Person项目=使用Person(ps=>ps.Where(x=>x.Age<40.Take(1)).FirstOrDefault();
    }
    公共T[]使用人(Func项目)
    {
    使用(myEntities ctx=new myEntities())
    {
    返回项目(ctx.Person.Where(x=>x.Age<50)).ToArray();
    }
    }
    
    我编辑了您问题的标题,因为这是一条using语句,而不是using指令。您是否尝试执行该代码,它是否有效?我编辑了您问题的标题,因为这是一条using语句,而不是using指令。您是否尝试执行该代码,它是否有效?