Entity Framework Include是否需要.first()?

时间:2013-01-03 12:31:36

标签: c# entity-framework linq-to-entities

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

var context = new MyContext();
context.Resources.Include(x => x.Variations).First();
return context;

但其他人不这样做:

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

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

3 个答案:

答案 0 :(得分:2)

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

构造一个查询,在执行时加载所有资源及其变体。然后丢弃该查询。从不执行查询意味着您没有获得查询结果,并且您没有获得执行该查询的副作用。

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

foreach (var resource in context.Resources.Include(x => x.Variations))
{
    /* ... */
}

或者,如果您只想让对象出现在您的上下文中,

using System.Data.Entity;

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

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

答案 1 :(得分:0)

当你这样做时

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

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

答案 2 :(得分:0)

简而言之:它被称为不同实体加载的效果。在实体框架中,有三个提货单:lazy,explicit和eagerly loading方法,您可以从中选择,并在代码中相应地使用。

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

  • 急切加载
  • 延迟加载
  • 显式加载

本文详细讨论了上述三种技术 - Loading Related Entities

下面的代码片段正在急切地加载:

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;
    }