C# 实体框架是否会执行n+;1查询1:1参考相关表?

C# 实体框架是否会执行n+;1查询1:1参考相关表?,c#,entity-framework,C#,Entity Framework,如果我有这个POCO课程 class MainEntity { public int id {get;set;} public string name {get;set;} public virtual Related myRelated {get;set;} } 与本课程相关 class Related { public int id {get;set;} public string name {get;set;} } 这些实体以1:1的比

如果我有这个POCO课程

class MainEntity
{
    public int id  {get;set;}
    public string name {get;set;}
    public virtual Related myRelated {get;set;}
}
与本课程相关

class Related 
{
     public int id  {get;set;}
     public string name {get;set;}
}
这些实体以1:1的比例相互关联


将查询
db.maintentity.ToList()由于延迟加载而对数据库执行N+1查询,或者,一旦它与1:1引用相关,将只执行1次查询?

当您执行
列表时,它将只通过一次查询检索所有
maintentity
对象的列表。如果链接了任何相关实体,则根本不会加载它们

然后,导航到
myMain.Related
属性后,将触发延迟加载,并将创建一个查询来加载相关引用对象的值

现在,如果您想在一个查询中直接加载引用中的所有数据,也可以这样做。您可以使用
.Include
扩展方法来执行此操作。在您的示例中,它看起来像这样:

db.maintentity.Include(m=>m.Related).ToList()


您还应该检查关于如何执行惰性/急切加载的详细信息以及它在SQL中的含义。

当您执行
列表时,它只需通过一个查询检索所有
maintentity
对象的列表。如果链接了任何相关实体,则根本不会加载它们

然后,导航到
myMain.Related
属性后,将触发延迟加载,并将创建一个查询来加载相关引用对象的值

现在,如果您想在一个查询中直接加载引用中的所有数据,也可以这样做。您可以使用
.Include
扩展方法来执行此操作。在您的示例中,它看起来像这样:

db.maintentity.Include(m=>m.Related).ToList()

您还应该检查关于如何进行惰性/急切加载的详细信息,以及它在SQL中的含义。

db.maintentity.ToList()
将执行一次查询,以获取所有
MainEntity
行的列表-也就是说,最初根本没有检索到
相关的
内容-仅当您开始引用那些
相关的
引用时,然后延迟加载将根据需要逐个加载那些“相关”实体
db.MainEntity.ToList()
将执行一次查询,以获取所有
MainEntity
行的列表-也就是说,最初根本没有检索到任何
相关的
内容-仅当您开始引用那些
相关的
引用时,然后延迟加载将根据需要逐个加载这些“相关”实体