C# 在实体框架中何时执行Include()?
我有一个简单的问题,但没有找到答案。C# 在实体框架中何时执行Include()?,c#,entity-framework,C#,Entity Framework,我有一个简单的问题,但没有找到答案。 如果我这样做 var result=_db.Table.Include(t=>t.Child).Where(t=>t.Id==Id).Single() 当join正在呼叫时? 找到我的实体后,或在SQL查找行期间包含每个子项后? 让我们看看基于简单db模型的示例: public class Head { //... columns public virtual Child {get; set;} public Guid? ChildI
如果我这样做
var result=_db.Table.Include(t=>t.Child).Where(t=>t.Id==Id).Single()代码>
当join
正在呼叫时?
找到我的实体后,或在SQL查找行期间包含每个子项后?
让我们看看基于简单db模型的示例:
public class Head
{
//... columns
public virtual Child {get; set;}
public Guid? ChildId {get; set;}
}
void main()
{
//The first version of code
var child = _db.Head.Include(h => h.Child)
.FirstOrDefault(//boring staff but we don't need child here)
?.Child;
if (child != null)
foo(child);
//The second one
var head = _db.Head.FirstOrDefault(//boring staff);
if (head != null && head.ChildId.HasValue)
foo(head.Child); // I know here we make a new request to our db
}
两个选项中哪一个更有效率?
基于父表的筛选器查询,当我只需要一个对象时,我担心“通过SQL加载额外的子对象”。
提前谢谢 它将首先评估where条件。不是在C#中,而是在生成的SQL中。
这将生成类似以下内容的SQL
SELECT top 1 .... FROM Table t
JOIN Child c ....
WHERE t.Id = id
您的数据库服务器将创建一个执行计划,该计划将在索引中查找该项并获取相应的子项。它将首先评估where条件。不是在C#中,而是在生成的SQL中。
这将生成类似以下内容的SQL
SELECT top 1 .... FROM Table t
JOIN Child c ....
WHERE t.Id = id
您的数据库服务器将创建一个执行计划,该计划将在索引中查找项目并获取相应的子对象。不包含Include
将延迟加载子对象,直到您需要它们为止。因此,如果您要像这样迭代父/子组
foreach (var parent in _db.Table.Include(t => t.Child).Where(p => p.Name.StartsWith("Q")))
foreach (var child in parent.Child)
Console.WriteLine($"{child}, child of {parent}");
往返次数等于父母人数加一
如果使用Include
,则所有子对象都将与父对象一起加载,而不会对每个父对象进行单独的往返。因此,上述代码的数据库往返次数将等于1
如果是单个
,则可以按如下方式重写
var result = _db.Table.Include(t => t.Child).Single(t => t.Id == id);
往返次数为1次,包含Include
,2次,不包含Include而不包含Include
的往返次数子对象的加载将推迟到您需要时。因此,如果您要像这样迭代父/子组
foreach (var parent in _db.Table.Include(t => t.Child).Where(p => p.Name.StartsWith("Q")))
foreach (var child in parent.Child)
Console.WriteLine($"{child}, child of {parent}");
往返次数等于父母人数加一
如果使用Include
,则所有子对象都将与父对象一起加载,而不会对每个父对象进行单独的往返。因此,上述代码的数据库往返次数将等于1
如果是单个
,则可以按如下方式重写
var result = _db.Table.Include(t => t.Child).Single(t => t.Id == id);
往返次数为1次,包含Include
,2次,不包含Include
您能重新回答一下您的问题吗?理解问题是什么有点困难。我认为您不了解实体框架是如何工作的,它将只运行一个查询,并且只在调用.single()
时运行。您可以通过分析数据库和观察查询来轻松地自己解决这个问题。你无论如何都应该学会这样做。@MarkC。我重新措辞了。对不起,我的英语很好:-)你能试着把你的问题改写一下吗?理解问题是什么有点困难。我认为您不了解实体框架是如何工作的,它将只运行一个查询,并且只在调用.single()
时运行。您可以通过分析数据库和观察查询来轻松地自己解决这个问题。你无论如何都应该学会这样做。@MarkC。我重新措辞了。对不起,我的英语很好:-)我想这就是我试图理解的。顺便提一下,我已经更新了我的问题。我想这就是我试图理解的。顺便说一下,我已经更新了我的问题。