EF Core 包含列表嵌套列表

4

我有一个非常简单的模型。 主类Recipe包含一个RecipeItem列表。每个RecipeItem都有一个RecipeItemComponents列表。

使用Entity Framework上下文,我可以这样做:

var ret = await _context.Recipes
.Include(x => x.RecipeItems)
.ToListAsync();

这段代码返回包含食谱项目的食谱,但是对于每个食谱项目,我没有RecipeItemsComponent列表。这是有道理的,因为我没有包含它们,但是我不确定如何解决这个问题。谢谢。

2
Include 后使用 ThenInclude - Rudresha Parameshappa
看看这个是否有帮助:https://stackoverflow.com/questions/48277087/entity-framework-core-include-nested-list-inside-list - Edney Holder
2
正如@RudreshaParameshappa所说,您正在寻找.Include(x => x.RecipeItems).ThenInclude(ri => ri.RecipeItemsComponent) - Camilo Terevinto
@RudreshaParameshappa 这是我在写这篇文章之前尝试过的方法,但是你示例中的“ri”是一个RecipeItems列表,所以它不允许我执行ri.RecipeItemsComponent操作。 - ff8mania
@ff8mania,Visual Studio不支持ThenInclude的智能感知。只需键入您的集合属性,然后它就会得到更新。 - Rudresha Parameshappa
@RudreshaParameshappa 这种方式甚至都无法构建... - ff8mania
2个回答

6

以下是我的工作代码示例

模型

public class Parent
{
    public int Id { get; set; }

    public string Name { get; set; }

    public virtual List<Child1> Child1s { get; set; }
}

 public class Child1
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int ParentId { get; set; }
    public Parent Parent { get; set; }

    public virtual List<Child2> Child2s { get; set; }
}

public class Child2
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int Child1Id { get; set; }
    public Child1 Child1 { get; set; }
}

在DB上下文类中

public class TestDbContext : DbContext
{
    public TestDbContext(DbContextOptions<TestDbContext> options)
        : base(options)
    {
        Database.EnsureCreated();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasMany(x => x.Child1s).WithOne(x => x.Parent).HasForeignKey(x => x.ParentId);
        modelBuilder.Entity<Child1>().HasMany(x => x.Child2s).WithOne(x => x.Child1).HasForeignKey(x => x.Child1Id);

        this.InitialData(modelBuilder);
        base.OnModelCreating(modelBuilder);
    }

    protected void InitialData(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasData(new Parent[]
        {
            new Parent
            {
                Id = 1,
                Name = "Parent 1",
            }
        });

        modelBuilder.Entity<Child1>().HasData(new Child1[]
        {
            new Child1
            {
                Id = 1,
                Name = "Child 1 1",
                ParentId = 1,
            }
        });
        modelBuilder.Entity<Child2>().HasData(new Child2[]
        {
            new Child2
            {
                Id = 1,
                Name = "Child 2 1",
                Child1Id = 1
            }
        });
    }

    public DbSet<Parent> Parent { get; set; }
    public DbSet<Child1> Child1s { get; set; }
    public DbSet<Child2> Child2s { get; set; }
}

控制器

public class ParentsController : Controller
{
    private readonly TestDbContext _context;

    public ParentsController(TestDbContext context)
    {
        _context = context;
    }        public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var parent = await _context.Parent
            .Include(x=>x.Child1s).ThenInclude(x=>x.Child2s)
            .FirstOrDefaultAsync(m => m.Id == id);
        if (parent == null)
        {
            return NotFound();
        }

        return View(parent);
    }
}

这是输出结果 这里是图片描述

-2

1
是的,它确实可以。https://learn.microsoft.com/zh-cn/ef/core/querying/related-data#code-try-9 - jle
从EF Core 1.0开始,我也这样认为。 - jle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接