2017-10-20 118 views
1

我正在使用VS2017創建一個ASP.NET Web應用程序(不使用CORE),.NET Framework是4.6.2,實體框架.NET是6.1。 3。我在這裏看到了我的答案,但是我所嘗試或提到的所有內容都不適用於我。從實體框架.NET返回多個孫子孫子的父代

我有以下代碼現在獲取特定父的孩子孫子,我知道必須有獲得這些孫子的更有效的方式,但無法弄清楚如何:我

  using (_ge = new generation_entities()) 
     { 
      if (_id != null) 
      { 
       List<scheduleheader> _tlist = (from a in _ge.scheduleheaders.Include("scheduledetails") where a.programID == _id select a).ToList(); 
       foreach (scheduleheader _t in _tlist) 
       { 
        foreach (scheduledetail _s in _t.scheduledetails) 
        { 
         _s.scheddtlcustoms = (from a in _ge.scheddtlcustoms where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtlstandards = (from a in _ge.scheddtlstandards where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtltalks = (from a in _ge.scheddtltalks where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtlvenues = (from a in _ge.scheddtlvenues where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheduledtlrecurrences = (from a in _ge.scheduledtlrecurrences where a.dtlID == _s.dtlID select a).ToList(); 
        } 
       } 
       return _tlist; 
      } 
      else 
       return (from a in _ge.scheduleheaders where a.scheduledetails.Any(b => b.start > DateTime.Today.AddDays(-30)) && a.programID == null select a).ToList(); 
     } 

有嘗試使用.ThenIncludeInclude("xxxx.xxxx.xxxx")但是,.ThenInclude甚至沒有提供給我和Include("xxxx.xxxx.xxxx")只適用於一個孫子。 Include()只允許我輸入字符串路徑,但我已經看到OP使用舊版EF的評論。

我被困在這,我可以開明,如果我在這裏失去了什麼?

回答

1

你可以將多個Include("xxxx.xxxx.xxxx")尖的在另一個答案。

但是,這將用單個SQL查詢替換當前的parents.Count * children.Count * grandChildrenTypes.Count個SQL查詢,但將怪異的SQL查詢合併到單個結果集中的所有列和所有記錄中,這也可能效率不高。

我會建議你一種混合的方法(類似於EF核心流程的Include S上的方式),這將在這種特殊情況下共有7個執行每父母1個SQL,1%的兒童和1元每孫子,即SQL查詢。只有父查詢結果存儲到變量中,子孫查詢纔剛剛執行,而整個骯髒的工作由EF導航屬性修正完成:

// Load parents 
var parentQuery = _ge.scheduleheaders.Where(a => a.programID == _id); 
var parents = parentQuery.ToList(); 
// Load children 
var childQuery = parentQuery.SelectMany(p => p.scheduledetails); 
childQuery.Load(); 
// Load grandchildren 
childQuery.SelectMany(c => c.scheddtlcustoms).Load(); 
childQuery.SelectMany(c => c.scheddtlstandards).Load(); 
childQuery.SelectMany(c => c.scheddtltalks).Load(); 
childQuery.SelectMany(c => c.scheddtlvenues).Load(); 
childQuery.SelectMany(c => c.scheduledtlrecurrences).Load(); 
// Done 
return parents; 
+0

我要試試這個,我會讓你知道它是如何工作的。 – mattgcon

1

你可以嘗試這樣的:

  var query = context 
        .Parents 
        .Include(p=>p.children) 
        .Include(p=>p.children.Select(x=>x.Grandchild1)) 
        .Include(p=>p.children.Select(x=>x.Grandchild2)) 
        .ToList(); 

你可以用linq訪問它,你可能有一個id,你可以這樣做:

var grandchild6 = query 
        .children 
        .FirstOrDefault(child=>child.Id =1) 
       ?.GranChildern 
       ?.FirstOrDefault(grandChild=>grandchild.Id = 6); 
+0

由於某些奇怪的原因,它只允許我進入包含括號內的字符串。 – mattgcon

+0

您可能需要在使用的語句 – 3xGuy

+0

中添加'使用System.Data.Entity'來感謝您使用'tip'。你的解決方案工作得很好,但是對於孫輩,我確實有一個小問題。說'x.Grandchild1'。我將如何去做到這一點,我已經試圖模仿包括但似乎無法得到它的工作 – mattgcon