有/无断点的不同结果

时间:2018-03-26 17:50:23

标签: c# linq entity-framework-core

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

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

        return temp;
    }

如果我在return temp;行上有断点,则d.BusApplDpndncyDepBusApplproperty第二个包含)似乎正确包含在内。如果我没有断点,它就是空的。我觉得这不是真正的问题,但这是我能够100%重现它的方式。

如果我.ToList()整个结果迫使它被评估并且似乎解决了问题,那么这应该是必要的吗?

这里有什么问题?

2 个答案:

答案 0 :(得分:0)

实际上,您只有选择数据,但没有投影。你必须添加例如ToList()ToArray()投射(执行)选择(查询)。它会导致结果转换为定位类型。如果不存在结果,则返回空列表或数组(以上面的示例为目标)。 好吧,换句话说,您的LINQ-to-Entities query将转换为SQL并针对服务器执行并检索结果。

如果你添加一个breakpoint,那么查询也将由VS执行。因此,你也不例外。

我不确定,但似乎只会在投影时执行Include

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

答案 1 :(得分:0)

由于linq中的查询适用于延迟执行概念.ToList(),因此有助于立即获得查询结果,即执行查询并返回结果。

如果要返回完整结果,则必须使用

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

我还没有在实体框架上工作过多,所以不能评论断点问题。可能是它正在进行异步操作