2013-04-02 64 views
127

好吧,我有以下層次三層次的實體:課程 - >模塊 - >章EF LINQ包括多個和嵌套實體

這裏是原來的EF LINQ聲明:

Course course = db.Courses 
       .Include(i => i.Modules.Select(s => s.Chapters)) 
       .Single(x => x.Id == id); 

現在,我想包含另一個與課程相關的名爲Lab的實體。

如何包含Lab實體?

我嘗試以下,但它沒有工作:在包括第二實體

Course course = db.Courses 
       .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab) 
       .Single(x => x.Id == id); 

任何想法?

任何建議或信息將不勝感激。謝謝!

+1

添加另一個「.Include」應該工作,除非你的意思是額外的包含是課程的孫子。 [看到這個](http://stackoverflow.com/questions/3356541/entity-framework-linq-query-include-multiple-children-entities)或[更好的選擇是這個](http://stackoverflow.com/問題/ 13819856/entity-framework-5-multiple-include-is-this-possible) –

回答

196

您是否嘗試過剛剛加入另一個Include

Course course = db.Courses 
       .Include(i => i.Modules.Select(s => s.Chapters)) 
       .Include(i => i.Lab) 
       .Single(x => x.Id == id); 

因爲Include並不需要一個布爾運算符

Include(i => i.Modules.Select(s => s.Chapters) &&   i.Lab) 
          ^^^    ^   ^
          list   bool operator other list 

更新 要了解更多信息,請下載LinqPad,並期待您的解決方案失敗通過樣品。 我認爲這是最快熟悉Linq和Lambda的方法。

作爲一個開始 - SelectInclude之間的區別在於有選擇你決定什麼要返回(又名投影)。 Include包含Eager Loading函數,它告訴實體框架您希望它包含來自其他表的數據。

Include語法也可以在字符串中。像這樣:

  db.Courses 
      .Include("Module.Chapter") 
      .Include("Lab") 
      .Single(x => x.Id == id); 

LinqPad中的樣本更好地解釋了這一點。

+0

欣賞它!我在哪裏可以學到更多?我特別感興趣的是包含和選擇之間的區別 – AnimaSola

+1

@AnimaSola我更新了我的答案 –

+2

只有這個爲我工作:'.include(「Module.Chapter」)'。任何想法爲什麼會這樣? –

20

Include精通接口的一部分,所以你可以寫多Include陳述每個以下其他

db.Courses.Include(i => i.Modules.Select(s => s.Chapters)) 
      .Include(i => i.Lab) 
      .Single(x => x.Id == id); 
+0

欣賞它!你能指出我在哪裏可以學到更多這些嗎?謝謝! – AnimaSola

+0

如果Modules有多個要加入的表,你知道語法是什麼嗎?說它鏈接到章和其他東西? –

+0

是.Net的流利部分還是這是需要安裝的庫嗎? – codea

15

你也可以嘗試

db.Courses.Include("Modules.Chapters").Single(c => c.Id == id); 
+2

謝謝 - 字符串中的點符號非常有用 – Evert

0

可以寫成擴展方法是這樣的:

/// <summary> 
    /// Includes an array of navigation properties for the specified query 
    /// </summary> 
    /// <typeparam name="T">The type of the entity</typeparam> 
    /// <param name="query">The query to include navigation properties for that</param> 
    /// <param name="navProperties">The array of navigation properties to include</param> 
    /// <returns></returns> 
    public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties) 
     where T : class 
    { 
     foreach (var navProperty in navProperties) 
      query = query.Include(navProperty); 

     return query; 
    } 

即使在通用的實現中也可以使用它entation:

string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" }; 

var query = context.Set<T>() 
.Include(includedNavigationProperties); 
+0

我正在嘗試您的答案,但由於本身無限循環,它拋出了stackoverflowexceptions。 –

+1

@VictoriaS。,你可以重命名擴展方法,以便它不會干擾真正的'Include' –

7

在實體框架核心(EF.core),可以使用.ThenInclude爲包括下一個水平。

var blogs = context.Blogs 
    .Include(blog => blog.Posts) 
     .ThenInclude(post => post.Author) 
    .ToList(); 

的更多信息:https://docs.microsoft.com/en-us/ef/core/querying/related-data

注: 假設您需要在blog.Posts多個ThenInclude(),重複剛纔的Include(blog => blog.Posts)做一套ThenInclude(post => post.Other)

var blogs = context.Blogs 
    .Include(blog => blog.Posts) 
     .ThenInclude(post => post.Author) 
    .Include(blog => blog.Posts) 
     .ThenInclude(post => post.Other) 
.ToList(); 
+0

在EF.core中,我似乎無法做到。包括(i => i.Modules.Select(s => s.Chapters)),具體是.Select裏面的.Include。任何人都可以確認或說話嗎? – ttugates

+0

@ttugates您打算如何使用此選擇?我認爲你想要做的就是你在EF內核中用'ThenInclude'做什麼。也許用一個很好的例子來提出一個問題,以便我們能夠回答它。 –

+0

[@Nick N](https://stackoverflow.com/users/869033/nick-n) - [實體框架Linq查詢:如何在多個Nav屬性中選擇並從第三個Nav屬性中選擇](https:// stackoverflow .COM /問題/ 47870578 /實體框架,LINQ查詢,如何到那裏,上多資產淨值的屬性和選擇)。因爲我選擇的不是我所匹配的,所以包含並不是必需的,所以問題是切線的。我的問題可能太「狹隘」了,但感謝任何幫助。 – ttugates