2016-12-03 24 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") 
相關問題