所以我在查询时遇到了这个小问题,我必须返回一个项目列表。以下是查询:
geographic = _iRepository.Geographics.Where(p => p.GeographID == ID)
.SingleOrDefault()
.Children
.SingleOrDefault()
.Children
.OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name)
.ToList();
ID(以及GeographID)都是指南。问题是我的查询卡在==部分,这意味着它永远找不到匹配项。如果我在代码的这一部分设置了断点,在它退出后,它会给我以下错误:
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
这很奇怪,因为我在其他地方有完全相同的代码,而且它运行得很完美!我应该补充一点,我使用的是带有实体框架的MVC 4,这是一个WebApi控制器(或从WebApi派生而来)。我已经研究并听说我可以做Lazy Loading
,但我不确定它是如何工作的。
我感谢所有的帮助!
错误表明您已经释放了DbContext对象。检查控制器代码。
也许这是使用脚手架创建控制器的原因。如果是这样,请检查控制器代码以找到以下内容:
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
删除它(不推荐)或将调用DbContext对象放在它之前。
或者你可以手动处理你的对象,或者通过using()
子句声明你的对象等等。无论如何,这个错误是因为你在处理对象后调用了它。检查你的代码。。。
更新:
另一种猜测是:您似乎在查询中使用导航属性。如果是,在这种情况下,您应该包括您需要的任何NavPr。试试这样的东西:
geographic = _iRepository.Geographics.Include("NavPr1")
.Include("NavPr2").Include("NavPr2.NavPr21")
.Where(p => p.GeographID == ID)
.SingleOrDefault()
// and the rest of query...
由于某些原因,上面的查询不起作用,而我尝试的其他一切都以相同的方式工作(对象被处理)。所以我决定使用附加的查询。这不是一个"解决方案",但它确实完成了任务。感谢所有的帮助:
geographic = (from g1 in _iEMARepository.Geographics
join g2 in _iEMARepository.Geographics
on g1.GeographID equals g2.ParentId
join g3 in _iEMARepository.Geographics
on g2.GeographID equals g3.ParentId
where g1.GeographID == ID
select g3).OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name).ToList();