得到你正在处理的资源
以下是一个坏主意,因为它会在返回之前处理 db
变量。
public IDBContext GetDBContext()
{
using (var db = new DBContext())
{
return db;
}
}
这也可能会产生更微妙的错误:
public IEnumerable<Person> GetPeople(int age)
{
using (var db = new DBContext())
{
return db.Persons.Where(p => p.Age == age);
}
}
这看起来没问题,但问题是 LINQ 表达式评估是惰性的,并且可能仅在以后已经处理了基础 DBContext
时执行。
因此,简而言之,在离开 using
之前不会评估表达式。仍然使用 using
的这个问题的一个可能的解决方案是通过调用将枚举结果的方法立即评估表达式。例如 ToList()
,ToArray()
等。如果你使用的是最新版本的 Entity Framework,你可以使用像 ToListAsync()
或 ToArrayAsync()
这样的 async
对应物。
你可以在下面找到实际操作的示例:
public IEnumerable<Person> GetPeople(int age)
{
using (var db = new DBContext())
{
return db.Persons.Where(p => p.Age == age).ToList();
}
}
但重要的是要注意,通过调用 ToList()
或 ToArray()
,表达式将被热切地评估,这意味着即使你没有迭代它们,所有具有指定年龄的人也将被加载到内存中。