[Expression Tree] LINQ動態欄位查詢-動態代理類別
此時若要再透過前文的動態查詢欄位方法,則必須建立另一個類別才能達到,例 ProductXXXInfo.........,雖然只要新增一個類別再繼承ProductInfo即可以,但之後隨著系統發展越來越大的話,這種為了動態查詢建立的代理類別會越來越多..........。心想手動建立代理類別的方式可以是動態的嗎....?
印象中EntityFramework預設就有使用代理類別來作LazyLoading機制,心想可以參考相關的作法來實作代理類別,在Google搜尋一下後,找到一篇使用ILGenerator來達到此功能。
什麼是ILGenerator? 根據MSDN的介紹,可以透過它在執行時期產生 Microsoft Intermediate Language (MSIL) 指令,建立動態組件、方法和建構函式...等等 (詳原文)。
動態建立代理類別
動態欄位查詢並回傳代理類別
前一篇文章的動態欄位查詢方法改成如下1.改成泛型方法,2.回傳代理類別
測試程式
如下紅框只查詢2個欄位且回傳一樣可以用型別ProductInfo,這樣的測試或許比較看不出什麼效果,但若你用EntityFramework的Log或SqlProfile去觀察的話,就會看到執行的sql只會有你動態查詢的欄位,而不是所有欄位。參考文章
http://www.cnblogs.com/why520crazy/articles/2781596.html(主要參考)
http://geekswithblogs.net/abhijeetp/archive/2010/04/04/a-simple-dynamic-proxy.aspx
http://www.codeproject.com/Articles/19513/Dynamic-But-Fast-The-Tale-of-Three-Monkeys-A-Wolf
範例程式
https://github.com/kimx/ExpressionLabps:請參考#region DynamicQueryProxy