C# 理解引擎盖下的EF。包含vs联接

C# 理解引擎盖下的EF。包含vs联接,c#,performance,entity-framework,C#,Performance,Entity Framework,我在实体框架上工作了一段时间,但它在引擎盖下的工作方式仍然存在一些“黑洞”。即使读了几篇文章,我也不确定我的理解是否正确 让我们从问题开始: EF Include如何在引擎盖下工作 Join和Include之间有什么区别 性能问题包括(延迟加载与急切加载、生成的SQL查询等) 什么时候我应该使用Join来代替Include,反之亦然 通过linq或lambda表达式查询EF时,如果基础架构不提供FKs,则只需要join语句,因此对象上没有导航属性 另一方面,include(即时加载)和laz

我在实体框架上工作了一段时间,但它在引擎盖下的工作方式仍然存在一些“黑洞”。即使读了几篇文章,我也不确定我的理解是否正确


让我们从问题开始:

  • EF Include如何在引擎盖下工作
  • Join和Include之间有什么区别
  • 性能问题包括(延迟加载与急切加载、生成的SQL查询等)
  • 什么时候我应该使用Join来代替Include,反之亦然

通过linq或lambda表达式查询EF时,如果基础架构不提供FKs,则只需要join语句,因此对象上没有导航属性

另一方面,include(即时加载)和lazy加载只能在存在FK的情况下工作,因为它使用导航属性

在这两种情况下,基础sql都将使用联接(因为sql没有“导航属性”概念)

至于表现,则视情况而定。延迟加载与急切加载(在FK场景中也是如此)可能是一个困难的选择

我通常使用延迟加载,当您有一个大的主结果时很有用,但是您只需要“连接”整个结果集的几个项目的数据


如果您提前知道需要整个resultset的联接数据,那么即时加载可能会提高性能。我建议您自己试验看看。

谢谢您的回答,但仍然需要更精确的答案。如果您手动添加了导航属性而没有基础外键,该怎么办。是否包括预期的工作?