有/没有断点的不同结果



在我的.NET Core Web应用程序的控制器中,我有以下端点:

    [HttpGet]
    public IEnumerable<BusAppl> BusinessApplications()
    {
        var temp = _context.BusAppl
            .Include(d=>d.BusApplDpndncyBusAppl)
            .Include(d=>d.BusApplDpndncyDepBusAppl);
        return temp;
    }

如果我在线路return temp;上有一个断点,则d.BusApplDpndncyDepBusApplproperty(第二个Inclave (似乎正确包含在内。如果我没有断点,那是无效的。在我看来,这是真正的问题,但这是我100%的时间重现它的方式。

如果我 .ToList()迫使它进行评估并似乎解决问题的整体结果,但这应该是必要的吗?

这里有什么问题?

实际上您只有数据的选择,但没有投影。您必须添加,例如 ToList()ToArray()到项目( execute (选择( query (。它将导致结果转换为靶向类型。如果不存在结果,它将返回一个空列表或数组(针对上面的示例(。好吧,换句话说,您的linq到实体查询将转换为SQL并针对服务器执行并检索结果。

如果添加了breakpoint,则查询也将由引擎盖下的VS执行。因此,您没有例外。

我不确定,但似乎Include仅在投影上执行。

尽管如此,如果您不修改查询(IQueryable<T>(,并且想要结果,则应执行它。否则可能会导致性能问题。

,因为linq中的查询在延期执行概念 .ToList()上工作有助于立即获得查询的结果,即执行查询并返回结果。

如果您想返回完整的结果,就必须使用

var temp = (_context.BusAppl
            .Include(d=>d.BusApplDpndncyBusAppl)
            .Include(d=>d.BusApplDpndncyDepBusAppl)).ToList();

我还没有在实体框架上工作,因此无法就断点问题发表评论。可能是它做异步操作

最新更新