C# 实体框架是否会执行n+;1查询1:1参考相关表?
如果我有这个POCO课程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的比
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
行的列表-也就是说,最初根本没有检索到任何相关的内容-仅当您开始引用那些相关的引用时,然后延迟加载将根据需要逐个加载这些“相关”实体