Include()方法适用于对象上的list。但如果我需要深入两层呢?例如,下面的方法将返回包含如下所示属性的ApplicationServers。然而,ApplicationsWithOverrideGroup是另一个包含其他复杂对象的容器。我可以在这个属性上做一个Include()吗?或者如何让该属性完全加载?

按照目前的情况,这种方法:

public IEnumerable<ApplicationServer> GetAll()
{
    return this.Database.ApplicationServers
        .Include(x => x.ApplicationsWithOverrideGroup)                
        .Include(x => x.ApplicationWithGroupToForceInstallList)
        .Include(x => x.CustomVariableGroups)                
        .ToList();
}

将只填充Enabled属性(下面),而不填充Application或CustomVariableGroup属性(下面)。我该怎么做呢?

public class ApplicationWithOverrideVariableGroup : EntityBase
{
    public bool Enabled { get; set; }
    public Application Application { get; set; }
    public CustomVariableGroup CustomVariableGroup { get; set; }
}

当前回答

对于 EF 6

using System.Data.Entity;

query.Include(x => x.Collection.Select(y => y.Property))

确保使用System.Data.Entity添加;来获取包含lambda的Include版本。


EF Core

使用新的方法ThenInclude

using Microsoft.EntityFrameworkCore;

query.Include(x => x.Collection)
     .ThenInclude(x => x.Property);

其他回答

让我清楚地说明一下,你可以使用字符串重载来包含嵌套的级别,而不管对应关系的多样性,如果你不介意使用字符串字面量:

query.Include("Collection.Property")

我想出了一个最简单的方法。你不需要安装软件包ThenInclude。EF或者你不需要对所有嵌套的导航属性使用ThenInclude。只要按照下面的步骤去做,EF会为您照顾好休息。 例子:

var thenInclude = context.One.Include(x => x.Twoes.Threes.Fours.Fives.Sixes)
.Include(x=> x.Other)
.ToList();

对于 EF 6

using System.Data.Entity;

query.Include(x => x.Collection.Select(y => y.Property))

确保使用System.Data.Entity添加;来获取包含lambda的Include版本。


EF Core

使用新的方法ThenInclude

using Microsoft.EntityFrameworkCore;

query.Include(x => x.Collection)
     .ThenInclude(x => x.Property);

我有一个索引页面,显示MbsNavigation。作为外键加载的固件对象的名称。固件对象很大,因此通过Internet加载索引页需要几分钟。

BatterySystem = await _context.BatterySystems.Include(b => b.MbsNavigation)

这是一个加载固件的解决方案。名字只有:

BatterySystem = await _context.BatterySystems
.Include(b => b.MbsNavigation)
.Select(b => new BatterySystem() 
{
    Name = b.Name,
    MbsNavigation = new Firmware() { Name = b.MbsNavigation.Name },
})
.ToListAsync();

现在索引立即加载。

我做了一个小的帮助实体框架6(。Net Core样式),以一种很好的方式包含子实体。

它是在NuGet现在:安装包然后包括。EF6

using System.Data.Entity;

var thenInclude = context.One.Include(x => x.Twoes)
    .ThenInclude(x=> x.Threes)
    .ThenInclude(x=> x.Fours)
    .ThenInclude(x=> x.Fives)
    .ThenInclude(x => x.Sixes)
    .Include(x=> x.Other)
    .ToList();

该软件包在GitHub上可用。