1. 程式人生 > >EF的Include 在.NET Framework 和.net core 中進行多個表查詢的時候不同的寫法

EF的Include 在.NET Framework 和.net core 中進行多個表查詢的時候不同的寫法

下午正在開開心心擼程式碼的時候,老闆叫我過去說要問我問題,因為老闆最近莫名對.Net產生興趣,開始自己看書擼後臺,所以經常把我叫辦公室問我一些我也不懂的問題(畢竟我也是渣渣,老闆也算是推動我學習進步的源泉,每次問完我我都要去先自己學一遍,再去教老闆)。

  • 問題如下

 在專案中存在三個表,A,B,C  其中 A下面有一群B小弟,而B下面有一群C小弟,子子孫孫無窮盡也,但是這個時候我們需要把他們所有的資料全都查找出來,就像株連九族一樣,至於為啥我老闆這麼狠心,我不知道,反正我要把A下面的所有B和B下面的所有C 都給他查出來,這個時候我腦海中想起了我當初實習的時候寫過一個類似的功能,就是跟駕考寶典那種答題的功能一樣,通過一個題目Id,獲取出來題目表的題目和選項表中的選項,然後我就給老闆推薦使用Include ,但是發現老闆的編輯器上面赫然呼叫著Include方法,執行後發現只能查詢到B表的資料,但是C表的資料居然都沒查出來,我覺得老闆一定是上天派督促我學習的,我以前用了那麼多次Include居然沒有想到這一步,我操,於是我產生了濃濃的研究興趣。

  • 不是那麼令人吃驚的.NET Framework 下的解決方案

 在我多方研究論證以後(就是瘋狂百度各種看別人的部落格)終於讓我找到了解決的方案:

static void Main(string[] args)
{
  using (var db = new Entities())
  {
   var model = db.A.Include(a => a.B).Include(a=>a.B.Select(x=>x.C)).FirstOrDefault();
   }
}

其實就是多加個.Include的問題,首先我們要找的主表是A,而B是A的小弟,那麼在A裡面就有ICollection<B> B 這個欄位,我們就先將B表全部查詢出來,畢竟擒賊先王,那麼B表查找出來了,C表還會跑麼?當然不會,我們再用同樣方法發現,B表裡面存在C的ICollection<C>C這個欄位,既然找到了這一步,我們就可以在搞一個Include,但是,由於是以A為主表,所以我們先通過A把B找出來,然後通過找出來的B在去查詢B裡面的C 這樣一層一層的往下找,我麼會發現,所有資料都被我們找出來了。

值得一提的是,我以前寫Include的時候都是直接 Include("表名");這種寫法,而在Include裡面寫 蘭姆達表示式的話,是需要我們引用System.Data.Entity 這個 名稱空間的。

  • .netCore 解決方法

 太監了太監了,有時間再寫 拜拜 

就是   Include().ThenInclude()  具體方法 下次再寫