在我的.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();
我还没有在实体框架上工作,因此无法就断点问题发表评论。可能是它做异步操作