得到你正在處理的資源
以下是一個壞主意,因為它會在返回之前處理 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()
,表示式將被熱切地評估,這意味著即使你沒有迭代它們,所有具有指定年齡的人也將被載入到記憶體中。