我正在使用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
,并在结果中包含Animals
,Dogs
和Shepherds
。我有:
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讨论,尽管不确定如何利用建议的方法更深入地了解我的嵌套关系模型 。)
答案 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>
上运行的第一个重载的自动完成提示。如果您继续并使用正确的重载,它最终会找出来的,并且不会阻止您正确地编译它。