EF核心嵌套然后包含

时间:2019-12-23 19:06:18

标签: c# asp.net-core nested entity-framework-core

我正在使用EntityFramework(EF)核心和ASP.NET核心。

我的模型是:

class Zoo
{
    public ICollection<Animal> Animals {set; get;}
}

class Animal
{
    public ICollection<Dog> Dogs {set; get;}
}

class Dog
{
    public ICollection<Shepherd> Shepherds {set; get;}
}

(这不是我的模型的确切定义,该示例已经足够接近,希望它可以简单地显示嵌套关系。)


问题

我想用给定的Zoo查询id,并在结果中包含AnimalsDogsShepherds。我有:

var animals = await context.Zoo
                    .Include(zoo => zoo.Animals)
                    .ThenInclude(animal => animal.Dogs) // operates on the Animal type
                    .FirstAsync(zoo => zoo.ID = id)

是否有关于如何添加Shepherds的想法?

注意:我知道有关Github的this讨论,尽管不确定如何利用建议的方法更深入地了解我的嵌套关系模型 。)

1 个答案:

答案 0 :(得分:2)

如果要在结果中包括dog.Sheperds,则只需继续进行ThenInclude调用:

var animals = await context.Zoo
    .Include(zoo => zoo.Animals)
        .ThenInclude(animal => animal.Dogs)
            .ThenInclude(dog => dog.Sheperds)
    .FirstAsync(zoo => zoo.ID = id);

ThenInclude() calls中的每一个都对先前的结果进行操作,因此您可以使用它来进行更深入的研究。只有Include()会重置为原始级别。因此,例如,如果您想包含来自Animal的多个集合,那么您将不得不从这些开头重新开始:

var animals = await context.Zoo
    .Include(zoo => zoo.Animals)
        .ThenInclude(animal => animal.Dogs)
            .ThenInclude(dog => dog.Sheperds)
    .Include(zoo => zoo.Animals)
        .ThenInclude(animal => animal.Cats)
    .FirstAsync(zoo => zoo.ID = id);

注意:使用ThenInclude时,IntelliSense通常会为您提供在TPreviousProperty而不是IEnumerable<TPreviousProperty>上运行的第一个重载的自动完成提示。如果您继续并使用正确的重载,它最终会找出来的,并且不会阻止您正确地编译它。