一个包含后如何执行多个然后包含导航道具

Pas*_*cal 5 c# entity-framework-core

对于TestType,我想同时包含导航道具Schoolclass和Subject。

我可以这样做:

.Include(t => t.TestType)
 .ThenInclude(x => x.Subject)
Run Code Online (Sandbox Code Playgroud)

但不是:

.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.ThenInclude(x => x.Schoolclass)
Run Code Online (Sandbox Code Playgroud)

因此,我尝试了一些技巧,并且奏效了:

我将TestType包含了2次...

var test = await context.Tests.Where(t => t.SchoolyearId == schoolyearId)
                                          .Include(t => t.TestType)
                                          .ThenInclude(x => x.Subject)
                                           .Include(t => t.TestType)
                                          .ThenInclude(x => x.Schoolclass)
                                           .AsNoTracking()
                                          .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

这是官方的方法还是有更好的方法?

更新

   public class TestType
    {
        public TestType()
        {
            Tests = new HashSet<Test>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public int Weight { get; set; }
        public ISet<Test> Tests { get; set; }
        public Schoolyear Schoolyear { get; set; }  
        public Schoolclass Schoolclass { get; set; }   
        public Subject Subject { get; set; }
        public int SchoolyearId { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

最好的方法是您之前写过,带有两个.Include(t => t.TestType)

var test = await context.Tests.Where(t => t.SchoolyearId == schoolyearId)
                                      .Include(t => t.TestType)
                                      .ThenInclude(x => x.Subject)
                                       .Include(t => t.TestType)
                                      .ThenInclude(x => x.Schoolclass)
                                       .AsNoTracking()
                                      .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

如果您在SQL事件探查器中看到查询结果,则查询是您假装的,而没有重复对TestType的包含(该表只有1个联接)

您还有另一种方法可以做到,但是我更喜欢以前的方法!

.Include("TestType.Subject") 
.Include("TestType.Schoolclass")  
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 1

这种方法是 1.1.0 中唯一存在的方法:)

更好的一个有点不同 - 不要在一个查询中加载所有对象(数据库将连接 4 个表 - Tests, TestType, Schoolyear, Schoolclass),因为这可能会导致不必要的数据增长(当你在 中有很多记录时tests)。

如果您的某些表(Schoolyear?甚至 TestType?)包含相对少量的记录(与“主”Tests表相比) - 您可以TestTypes.Include(x => x.Subject).Include(x => x.Schoolclass)先加载,将它们保存在某个列表中,然后仅查询而Tests无需额外的“包含”。但是,一旦您TestType在内存中拥有了所有必需的依赖项,就可以从内存中访问它们。

此外,如果您的某些表很少更改 - 使用缓存从数据库中读取它们一次,并在必要时重新读取(删除管理此表的控制器中的适当缓存条目)。