在我的.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()
整个结果迫使它被评估并且似乎解决了问题,那么这应该是必要的吗?
这里有什么问题?
答案 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();
我还没有在实体框架上工作过多,所以不能评论断点问题。可能是它正在进行异步操作