天天看點

Linq之Expression進階篇(常用表達式類型)

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t1" target="_blank">寫在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t2" target="_blank">系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t3" target="_blank">變量表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t4" target="_blank">常量表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t5" target="_blank">條件表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t6" target="_blank">指派表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t7" target="_blank">二進制運算符表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t8" target="_blank">一進制運算符表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t9" target="_blank">循環表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t0" target="_blank">塊表達式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t01" target="_blank">總結</a>

首先回顧一下上篇文章的内容,上篇文章介紹了表達式樹的解析和編譯。如果忘記了,可以通過下面系列文章提供的入口進行複習。這篇文章将介紹常見的表達式類型。

常見的表達式類型都有個共同的基類expression。建立這些類型的對象,是通過api的方式建立的(也就是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>

<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html">linq之expression初見</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4230226.html">linq之expression進階</a>

在表達式樹中使用parameterexpression或者parameterexpression表達式表示變量類型,下面看一個例子,我們定義一個int類型的變量i:

或者使用

通過f12轉到定義,發現這兩個方法的注釋幾乎是一樣的。靜态方法parameter第一個參數:定義的參數類型,第二個參數:為參數名稱。

在表達式樹中使用constantexpression表達式表示具有常量值的表達式。,看一個例子,我們定義一個int類型的常量5.并将該值指派給上面定義的變量i

Linq之Expression進階篇(常用表達式類型)
Linq之Expression進階篇(常用表達式類型)

constrant方法第一個參數:常量,第二個參數為什麼類型的常量。

這裡提到了binaryexpression表達式,該表達式辨別包含二進制運算符的表達式,類似與=,&gt;這樣的二進制表達式都可以使用binaryexpression表達式來表示。

調試模式下,在自動視窗檢視目前表達式的debugview屬性,這個屬性在調試表達式樹的時候是非常有用的:

變量:

Linq之Expression進階篇(常用表達式類型)

常量:

Linq之Expression進階篇(常用表達式類型)

二進制表達式:

Linq之Expression進階篇(常用表達式類型)

通過觀察上面的圖,可知變量調試模式下debugview屬性将顯示前面帶有“$”符号的 parameterexpression 變量名稱。那麼如果參數沒有名稱,則會為其配置設定一個自動生成的名稱,例如 $var1 或 $var2(這裡不再舉例)。

在很多時候,我們都需要使用條件表達式來過濾一些資料,然後傳回滿足條件的資料,在表達式中有這樣一些表達式滿足你的需求。

常見運算符

&gt;,&gt;=

Linq之Expression進階篇(常用表達式類型)

&lt;,&lt;=

Linq之Expression進階篇(常用表達式類型)

if....then:如果滿足條件那麼..

if...then...else:如果滿足條件執行某某代碼,否則執行另外的邏輯

Linq之Expression進階篇(常用表達式類型)

一個例子

ifthenelse方法

Linq之Expression進階篇(常用表達式類型)
Linq之Expression進階篇(常用表達式類型)

輸出結果

Linq之Expression進階篇(常用表達式類型)

 例子描述:條件test包裝為常量表達式,因為test為true,是以執行iftrue的表達式,并調用writeline方法列印出資訊。

=

還以上面為變量i指派的例子為例

+=

-=

*=

/=

舉一個例子

Linq之Expression進階篇(常用表達式類型)
Linq之Expression進階篇(常用表達式類型)

結果

Linq之Expression進階篇(常用表達式類型)

在上面也提到了部分二進制運算符表達式,類似加減乘除這樣的運算符,對于二進制運算符,就不再舉例。這些傳回的表達式樹,都可以使用binaryexpression來接收,或者使用基類expression接收,或者更省事,使用var關鍵字。

類似++,--運算符

i++等價于i=i+1,運算順序就是i先加1,然後再指派給i。在表達式書中使用expression的postincrementassign方法來進行自增或者自減操作。傳回結果為unaryexpression類型,同樣可以使用基類expression接收,或者var。

在表達式樹中使用expression的loop方法實作循環。

在前面的文章中,也說了不能使用lambda方式建立帶塊級的表達式樹,不然會有如下的錯誤

Linq之Expression進階篇(常用表達式類型)

通過api的方式可以建立塊級表達式樹,其中expression的block方法功不可沒。例如上面的加減乘除的例子中,可以包括多個expression。

那麼,下面就舉一個包含自增的一進制表達式,循環的表達式塊,并輸出結果。

輸出1-100之間的所有偶數。

Linq之Expression進階篇(常用表達式類型)
Linq之Expression進階篇(常用表達式類型)
Linq之Expression進階篇(常用表達式類型)

本篇文章介紹了幾種常見的表達式類型,當然,還有很多并沒有列出,比如switch case,try catch等。如果在項目中需要建立複雜的表達式樹,expression的靜态方法block是必不可少的。希望通過本篇的學習,對你了解expression有所幫助。

參考文章

https://msdn.microsoft.com/zh-cn/library/dd323961(v=vs.110).aspx

https://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/4234747.html

繼續閱讀