C# 实体框架是否包含.First()的需求?

C# 实体框架是否包含.First()的需求?,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,在创建上下文时设置即时加载时,在EF中使用Include的许多示例如下所示(给定两个称为资源和变体的相关实体): 但其他人没有: context.Resources.Include(x=>x.Variations) 只有前者似乎对我有效,但我找不到任何解释来解释为什么需要它?当你这样做的时候 context.Resources.Include(x => x.Variations); 您将获得资源对象的列表。使用.First()将为您提供该资源列表中的第一个资源。简而言之:它被称为不同实体

在创建上下文时设置即时加载时,在EF中使用
Include
的许多示例如下所示(给定两个称为资源和变体的相关实体):

但其他人没有:

context.Resources.Include(x=>x.Variations)

只有前者似乎对我有效,但我找不到任何解释来解释为什么需要它?

当你这样做的时候

context.Resources.Include(x => x.Variations);

您将获得资源对象的列表。使用
.First()
将为您提供该资源列表中的第一个资源。

简而言之:它被称为不同实体加载的效果。在实体框架中,有三个层次:惰性、显式和急切地加载方法,您可以选择它们,并在代码中相应地使用它们

换句话说,实体框架支持三种加载相关实体的方式:

  • 急装
  • 延迟加载
  • 显式加载
本文详细讨论了上述三种技术-

下面的代码片段正在使用热切加载:

context.Resources.Include(x => x.Variations).First();
只有前者似乎对我有效,但我找不到任何解释来解释为什么需要它

后面的代码片段(不带
.First()
)不适用于您,因为可以使用快速加载(请参见上文快速加载相关实体)或加载方法来加载相关实体:

context.Resources.Include(x => x.Variations).Load();
// or a sample like
// Load the posts related to a given blog
context.Entry(blog).Collection(p => p.Posts).Load();
编辑:如果出于某种原因,您对延迟加载感到困惑,那么您可以使用选项在上下文中将其关闭

public MyContext()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
构造一个查询,该查询在执行时加载所有资源及其变体。然后放弃该查询。从不执行查询意味着您不会得到查询的结果,也不会得到执行该查询的副作用

您可以使用以下资源执行某些操作:

foreach (var resource in context.Resources.Include(x => x.Variations))
{
    /* ... */
}
或者,如果您只想让对象显示在您的上下文中

using System.Data.Entity;

context.Resources.Include(x => x.Variations).Load();

据我所知,没有办法设置上下文,以便在构造查询时总是隐式执行
.Include
的效果。您需要将其包含在每个查询中。

您的结果中需要哪些实体?更新后提到了渴望加载否,这不是延迟加载所指的。延迟加载是指通过访问属性来加载
变体,如
var resource=context.Resources.Single();/*或者随便什么*/foreach(var variation in resource.Variations){}
这个问题肯定使用了渴望加载。@hvd,我在我的答案中做了修改,因为从我第一次发布答案时起,问题主体已经发生了变化。因此,我的答案中的代码示例是指热切加载。我删除了我的否决票,因为你的答案不再是错误的,但在我看来,它仍然没有回答这个问题。不起作用的代码片段也试图使用急切加载。@hvd,我已经完成了应该解决这个问题的答案。我不认为我们出于同样的原因建议它,但同意您的结论(包括(…).Load()
位)。这也是我在回答中提到的,请看那里的解释。:)
foreach (var resource in context.Resources.Include(x => x.Variations))
{
    /* ... */
}
using System.Data.Entity;

context.Resources.Include(x => x.Variations).Load();