C# 中linq 访问idisposable 的注意事现
using(var db = new DBcontext(...))
{
var query = from u in db.User
from c in db.Contact.Where(p => u.UserId == p.ContactUserId && p.ContactMain).DefaultIfEmpty()
select new BO.UserInfo { User = u, Contact = c };
}
return query;
像上面这段代码,linq 的select语句里访问了继承了Idisposable 接口的对象db。在后面遍历query对象时,会抛出空引用(null reference) 异常。linq 语句是惰性求值的。在遍历query对象时,db对象已经被释放了(dispose 方法先运行,linq的迭代器后运行 )。
在Resharper 中会提示 “Access to disposed closure” in LINQ。在visual studio 中不会有这样的提示,但是运行时会抛出异常。
既然不能返回一个query 对象,那么正确的使用方式是什么?