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 中不会有这样的提示,但是运行时会抛出异常。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据