2016-12-03 34 views
2

对于一个TestType我想包括导航道具Schoolclass和Subject。如何做一个包含多个ThenInclude导航道具

我可以做一个:

.Include(t => t.TestType) 
.ThenInclude(x => x.Subject) 

但不是:

.Include(t => t.TestType) 
.ThenInclude(x => x.Subject) 
.ThenInclude(x => x.Schoolclass) 

因此我尝试了小动作和工作:

我包括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(); 

那是官方的做法还是有更好的?

UPDATE

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; } 
    } 
+0

什么是您的对象定义? –

+0

对象定义?你到底什么意思?哪个对象? :-) – Pascal

+0

您的对象的定义 –

回答

0

这种做法是存在于1.1.0 :)

更好的一个小不同只有一个 - 不加载在一个查询中的所有对象(DB将加入4表 - Tests,TestType,Schoolyear,Schoolclass),因为这可能会导致不必要的数据增长(当您将有很多或记录在tests)。 (?学年甚至TestType)

如果一些表中包含的记录相对较少(相比于“主” Tests表) - 可以加载TestTypes.Include(x => x.Subject).Include(x => x.Schoolclass)首先,将它们保存在一些列表中,然后查询只Tests没有额外的“包含”。但只要你已经有TestType所有需要的内存依赖关系 - 它们可以从内存访问。此外,如果某些表很少发生更改 - 请使用Caching从DB读取一次,并在必要时重新读取(在管理此表的控制器中删除相应的高速缓存条目)。

-1

为什么你不使用Include两次?

var myVar= ((MyContext) _context) 
      .MasterEntity 
      .Include(x => x.FirstChild) 
      .Include(x=>x.FirstChild.FirstGrandChild) 
      .Include(x=>x.FirstChild.SecondGrandChild) 
      .Where(x => x.Id== input) 
      .ToList(); 
0

最好的办法是,你之前写的,有两个.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(); 

如果你看到在SQL事件探查器的查询结果,查询是你假装,没有重复包括到TestType(只有1加入该表)

你有另一种方式来做到这一点,但我更喜欢以前的方式!

.Include("TestType.Subject") 
.Include("TestType.Schoolclass") 
相关问题