<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t1" target="_blank">寫在前面</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t2" target="_blank">系列文章</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t3" target="_blank">expression</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t5" target="_blank">表達式樹建立方式</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t4" target="_blank">一個例子</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html#t5" target="_blank">總結</a>
上篇文章介紹了擴充方法,這篇文章開始将陸續介紹在linq中使用最多的表達式樹的相關概念,以概念及例子一一列出如何在代碼中使用expression。
<a href="http://www.cnblogs.com/wolf-sun/p/4199383.html">linq之lambda表達式初步認識</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4206982.html">linq之lambda進階</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4214164.html">linq之隐式類型、自動屬性、初始化器、匿名類</a>
<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html">linq之擴充方法</a>
還是老樣子,首先看msdn中對表達式樹的描述
表達式樹以樹形資料結構表示代碼,其中每一個節點都是一種表達式,比如方法調用和 x < y 這樣的二進制運算等。 你可以對表達式樹中的代碼進行編輯和運算。 這樣能夠動态修改可執行代碼、在不同資料庫中執行 linq 查詢以及建立動态查詢。 表達式樹又稱為“表達式目錄樹”,以資料形式表示語言級代碼,它是一種抽象文法樹或者說是一種資料結構。
通過上面的描述,你會發現表達式樹的作用:動态修改可執行代碼、在不同資料庫中執行linq查詢及建立動态查詢。那它是如何做到的呢?那下面就開始咱們的表達式樹之旅吧。
表達式樹建立方式分為兩種:以lambda表達式的方式建立,通過api靜态方法建立。
若 lambda 表達式被配置設定給 expression<tdelegate> 類型的變量,則編譯器可以發射代碼以建立表示該 lambda 表達式的表達式樹。
看一個例子:

上面的代碼意思就以表達式目錄樹的形式将強類型的lambda表達式num=>num>=5辨別為資料結構。
通過 api 建立表達式樹需要使用 expression 類。
該類包含建立特定類型表達式樹節點的靜态工廠方法,比如表示參數變量的 parameterexpression,或者是表示方法調用的 methodcallexpression。 system.linq.expressions 名稱空間還解釋了 parameterexpression、methodcallexpression和另一種具體表達式類型。 這些類型來源于抽象類型 expression。
那麼我使用api的方式建立上面例子中的表達式樹:
說的很高大上,其實就是類expression的一系列靜态方法。
首先引入命名空間
通過上面的代碼你會發現這種方式在建立的時候,lambda表達式的左右及二進制運算符都要分别的建立,然後在通過expression.lambda方法建構lambda表達式。
在 .net framework 4 中,api 表達式樹還支援指派表達式和控制流表達式,比如循環、條件塊和 try-catch 塊等。
看一個例子,通過api表達式樹建立一個利用循環求1到n的和的表達式樹。
如果能這樣寫該有多好啊
可惜
通過api建立表達式樹,可以建立更為複雜的表達式樹,這裡先嘗嘗鮮
輸出結果
本篇文章主要介紹了表達式樹的概念及兩種建立方式。在文章的結尾給出了一個例子,也是先嘗嘗鮮,對于代碼中的一些靜态方法可先參考注釋。下篇文章将介紹一些expression的常用的靜态方法。
參考文章
http://msdn.microsoft.com/zh-cn/library/bb397951.aspx
部落格位址:
<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>
部落格版權:
本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。
如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!
再次感謝您耐心的讀完本篇文章。http://www.cnblogs.com/wolf-sun/p/4222473.html