發表文章

目前顯示的是有「ExpressionTree」標籤的文章

[Expression Tree] LINQ動態欄位查詢-動態代理類別

圖片
  在前一篇文章" LINQ動態欄位查詢 "介紹到使用Expression來作欄位的動態查詢,但此方法有一缺點是因EntityFramework在查詢時,不能回傳與來源型別一樣的結果,所以使用上會變成查ProductEntity但回傳另一型別ProductInfo。若只是基本的單資料表查詢,那倒還好,但在實務上通常會Join到其他資料表後,再回傳一個多個資料表欄位的類別,如下程式查詢 ProductEntity 及 CategoryEntity ,回傳 ProductInfo 。 此時若要再透過前文的 動態查詢欄位方法 ,則必須建立另一個類別才能達到,例 ProductXXXInfo.........,雖然只要新增一個類別再繼承ProductInfo即可以,但之後隨著系統發展越來越大的話,這種為了動態查詢建立的代理類別會越來越多..........。心想手動建立代理類別的方式可以是動態的嗎....?   印象中EntityFramework預設就有使用代理類別來作LazyLoading機制,心想可以參考相關的作法來實作代理類別,在Google搜尋一下後,找到一篇使用ILGenerator來達到此功能。    什麼是ILGenerator? 根據MSDN的介紹,可以透過它在執行時期產生 Microsoft Intermediate Language (MSIL) 指令,建立動態組件、方法和建構函式...等等 ( 詳原文 )。

[Expression Tree] LINQ動態欄位查詢

   最近專案有一需求是讓使用者挑選所需的欄位來顯示在列表上,以往用SQL語法都是組字串去查詢,但現在用的是Entityframework,若要在LINQ的查詢上作這件事,似乎就沒那麼容易....,幸好前陣子有對Expression作一些學習,將 舊文章 再溫習一篇後將此功能實作出來。 動態查詢欄位 如下程式,相關註解已寫在每行程式上方,唯一較特別的是此方法傳入的IQueryable是 ProductModel 但回傳的是 ProductTargetModel ,這是因為在Linq To Entities的查詢預設不支援同一型別的回傳。

[Expression Tree] MSDN學習系列 3-使用運算式樹狀結構建置動態查詢

   本系列的最後一篇文章,此篇要講的是如何使用運算式樹狀架構來 建立動態 (Dynamic) 的 LINQ 查詢 ,並在執行時期產生對應的查詢方法。在開始先來講為何需要動態查詢? 假設我們有一個GridView呈現產品清單,但要提供使用者直接在每個欄位的標題點選作排序、飾選的功能。若要依使用者點選的欄位來查詢的話,程式需依欄位名稱來各別寫Where或Orderby,如下程式 private void TraditionQuery() { string sortColumn = "ProductName"; string filterColumn = "CategoryName"; string filterValue = "HTC"; IQueryable<ProductModel> data = ProductModel.GetDatas(); switch (sortColumn) { case "CategoryName": data = data.OrderBy(m => m.CategoryName); break; case "ProductName": data = data.OrderBy(m => m.ProductName); break; } switch (filterColumn) { case "CategoryName": data = data.Where(m => m.CategoryName == filterValue); break; case "ProductName": data = data.Where(m => m.ProductName == filterValue); break; } } 目前只針對...

[Expression Tree] MSDN學習系列 2-修改運算式樹狀架構

圖片
     繼上篇 運算式樹狀架構 ,此篇要講的是如何修改運算式樹狀架構,預設的情形下,運算式樹狀架構是不可直接修改的.....嗯~~~有看沒有懂…對吧..XD,下列程式碼,就是一個完整的樹狀結構,但你不可以直接去異動他任一節點,例如:將大於換小於、and換成or Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");

[Expression Tree] MSDN學習系列 1-運算式樹狀架構

圖片
    最近參考一些較知名的Library,例:Automapper、DynamicQuery..等等,都有用到大量的Expression來作動態查詢,由於Expression認識的不夠深,以致在擷取某些程式碼來修改時都覺得很吃力......=.=。而這兩天剛好看到msdn有提供一系列的文章,想說將它整個練習一遍,並將所理解的記錄下來 ps:其實是轉化自己較容易懂的語言XD。 什麼是Expression Tree? 就是將程式碼當作樹狀結構的資料,並可以動態修改Runtime的程式碼、動態查詢及取得程式碼中的相關資訊。