Linq 跨 Table 的複合查詢

  • 4391
  • 0

欄位子句查詢 (Linq)

Include 載入 巢狀子Table (Lamda)

 

需求很單純「列出清單時,要可以直接看到最新一筆商品的圖片」,但是在正規化後的資料這圖片 和 清單橫跨了四個不同的 Table  ( 大致上…   Seriers  -1*-  SeriesVideo  -**- Video -1*- VideoThumbnails )  。

這在 SQL 語法上都要花一些時間去組成,那麼在 Linq 語法上怎麼寫和驗證會比較好

以前還在 EF 1 的時候,我可能會把這種複雜的分類到 SP 去寫,現在 EF 7 還有 LINQPad 可以幫助我們完成實在方便很多

LinqPad

LINQPad 下載 

這工具不多說實在是太方便了,用法就跟 SQL Server Management Studio 一樣,可以讓你寫語法直接從資料庫把資料抓出來,而且 Linq語法 和 Lamda 語法還可以互轉。

喜愛 ORM 的朋友我相信都已經有在用了,若是還沒有進來的話就更應該要看一下這個 :)

欄位子句查詢 (Linq)

主要要列出 Series 資料清單,但是要追加顯示 VideoThumbnail 的項目。因此在第一個 Select 上的 Cover 就再下 From Select 子句進行查詢,並且為了不讓每一筆都去 DB Query ,在where 條件下再用 From select 子句進行查詢將非必要的資料去除。

最後分頁的動作再用 Lamda 語法去接 Skip 和 Take 

出來的結果如上

回頭來看產生出來的 SQL 語法,這個就可以直接丟去看執行計劃,因為有做「排序」的動作所以資源都是花在那裡比較多。

若效能吃緊的話,再針對排序的欄位進行最佳化

Include 載入 巢狀子Table (Lamda)

子物件通常都會用 Include 確保關聯性的資料會一併取得,若是巢狀的話就必須在 Include 子句中再加上 Select 語法才行。一開始我還傻傻的用多個 Include  (淚)

 

EF 的複合 Table 的 CRUD ( Attach)

單一Table 的 CRUD 就不用再多說了,相信通常會卡的也不是在那裡 :)

但是遇到 Details 有 CRUD 要跟 Master 一起同步處理的話,可能就會比較討厭一點  。但只要弄好只要一個 Method 就可以搞定 CRUD ,程式碼可以少打非常非常多。 這裡的做法是用 Attach 的方式先跟 EF 註冊資料是要「新增」、「刪除」和「修改」,由於這是子物件清單,因此它會再跟 Master Table 一起進 Sumit ,所以必須去掉要刪除的清單 。

接下來也一樣將 Entity Attach 上去就可以了。

 

希望整理這些可以讓一些朋友可以少踩一點雷 XD