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查询
这可能会返回一个尚未执行的延迟查询FirstOrDefault
,试图执行它此时,可能的结果是代码崩溃,因为您试图使用已释放的上下文执行查询。否,
using
语句在查询的具体化过程中不会一直存在
除非调用Person
已经返回一个完全物化的集合,这是不可能的,也不是典型的
发生的情况如下:
Person
属性,然后执行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指令。您是否尝试执行该代码,它是否有效?