Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中何时执行Include()?_C#_Entity Framework - Fatal编程技术网

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。我重新措辞了。对不起,我的英语很好:-)我想这就是我试图理解的。顺便提一下,我已经更新了我的问题。我想这就是我试图理解的。顺便说一下,我已经更新了我的问题。