Asp.net mvc 查询未返回结果(但结果存在且查询在不同项目中工作)

Asp.net mvc 查询未返回结果(但结果存在且查询在不同项目中工作),asp.net-mvc,entity-framework,asp.net-mvc-4,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,所以我有一个查询的小问题,我必须返回一个项目列表。以下是查询: geographic = _iRepository.Geographics.Where(p => p.GeographID == ID) .SingleOrDefault() .Children .SingleOrDefault()

所以我有一个查询的小问题,我必须返回一个项目列表。以下是查询:

 geographic = _iRepository.Geographics.Where(p => p.GeographID == ID)
                             .SingleOrDefault()
                             .Children
                             .SingleOrDefault()
                             .Children
                             .OrderBy(p => p.DisplayOrder).ThenBy(p => p.Name)
                             .ToList();
ID(以及地理位置)都是GUI。问题是我的查询在==部分卡住了,这意味着它永远找不到匹配项。如果我在代码的这一部分设置了断点,在它退出后,它会给出以下错误:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection
这很奇怪,因为我在其他地方有完全相同的代码,它工作得非常完美!我应该补充一点,我使用的是带有实体框架的MVC4,这是一个WebAPI控制器(或者是从WebAPI派生的)。我已经研究并听说我可以做
延迟加载
,但我不确定它是如何工作的


我感谢所有的帮助

错误表示您已释放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...

错误表明您已释放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();

由于某种原因,上面的查询无法工作,我尝试的其他所有查询都以相同的方式工作(对象被处置)。所以我决定使用附加的查询。这不是一个“解决方案”,但它确实完成了工作。感谢您的帮助:

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();

我可以在这里发布我的控制器内部的完整操作,实际上没有任何东西可以“处置”对象。我这么说的原因是,我有一个几乎完全相同的查询副本(而不是使用GeographID,我使用Name属性),并且没有遇到这个问题。这和Web Api有什么关系吗?对不起,如果我不知道你所说的NavPr是什么意思,但你能解释一下它是什么吗。谢谢你只是导航属性。。。我的缩写是。。。!我明白了,我试试看。谢谢你的帮助!这一定是问题的原因。尝试查找导致此错误的NavPr,并将其包括在内。看看另一个有效的查询,看看你没有在那里使用什么NavPr…我可以在我的控制器中发布完整的操作,实际上没有任何东西可以“处理”对象。我这么说的原因是,我有一个几乎完全相同的查询副本(而不是使用GeographID,我使用Name属性),并且没有遇到这个问题。这和Web Api有什么关系吗?对不起,如果我不知道你所说的NavPr是什么意思,但你能解释一下它是什么吗。谢谢你只是导航属性。。。我的缩写是。。。!我明白了,我试试看。谢谢你的帮助!这一定是问题的原因。尝试查找导致此错误的NavPr,并将其包括在内。看看另一个有效的查询,看看你没有使用的NavPr…哦,对不起!将所有
.Include()
s放在
之前。Where()
在调试EF代码时,我也会看到此错误。这通常意味着查询中存在错误,但会引发此错误。为了解决实际问题,我将查询拆分,一步一步地执行,每次都转换
ToList()
。最终你会在代码中发现问题,当你把代码重新组合在一起时,上面看到的错误就会消失。哦,对不起!将所有
.Include()
s放在
之前。Where()
在调试EF代码时,我也会看到此错误。这通常意味着查询中存在错误,但会引发此错误。为了解决实际问题,我将查询拆分,一步一步地执行,每次都转换
ToList()
。最终,您会在代码中发现问题,当您重新组合代码时,上面看到的错误将消失。