天天看點

C#進階系列——動态Lamada

前言:在DDD系列文章裡面,我們在背景倉儲裡面封裝了傳遞Lamada表達式的通用方法,類似這樣:

通過前端傳過來的Lamada表達式,直接放到Where條件裡面查詢。那麼問題來了,我們前端如何傳入Lamada呢?當然,有人說了,這個不用傳啊,前端直接.Find(x=>x.Name=="abc")這樣寫就好了啊。确實,如果前端條件隻有一個條件,你确實可以這樣簡單處理,但是實際開發的過程中,我們很多時候是需要傳遞多個參數,并且.Find(x=>x.Name=="abc")這種寫法也不利于方法的封裝。于是,我們神奇的動态Lamada誕生了。

之前在介紹委托的時候我們介紹過一種特殊的匿名委托,它型如:

也就是說,不用定義一種具體的委托方法去對應SayHello(string name);,而直接delegate(string name){}這樣定義一種匿名的委托去執行,這樣能減少部分定義具體方法的代碼。

了解了匿名委托的概念,我們來看看我們經常使用的Linq裡面的擴充方法Where、Select等。先來看看一般用法:

我們來将Where裡面的x => x.Contains("_")分解。

有沒有很強大,是不是一樣一樣的。其實這樣一看lamada就是匿名委托的縮略形式。x => x.Contains("_")表達式左邊的表示Func裡面的string類型變量,x.Contains("_")表示bool類型的傳回值。有了這份進化史,程式員再也不用擔心面試官問我Lamada怎麼回事了。

與其叫動态Lamada,更加嚴謹一點應該叫動态Expression,因為拼接Lamada表達式用的基本都是Expression的類和方法。部落客習慣,暫且就叫它動态Lamada吧。廢話不多說,直接吃點栗子吧。

以上就構造了一個查詢List<DTO_ORDER>對象裡面ORDER_NO 屬性等于aaaa的lamada表達式。我們看看運作效果截圖:

C#進階系列——動态Lamada

是不是已經得到了我們想要的表達式!有沒有很簡單。。。

看到這裡有人就郁悶了,為了得到x=>x.ORDER_NO=="aaaa"這種表達式,你繞了這麼大一圈,有什麼屌用?直接lstRes=lstRes.Where(x=>x.ORDER_NO=="aaaa");就能夠搞定的事,你非要把簡單問題複雜化。其實不然,有一定程式設計經驗的朋友肯定知道,一般我們前端傳過來的查詢參數肯定不會隻有一個,當需要查詢多個參數時需要我們構造一個統一的Lamada傳遞到背景;當然你也可以說,我将多個參數全部傳遞到背景,然後再背景使用IQueryable接口去過濾。當然,這确實可行,但是别忘了我們封裝Find(Expression exp...)的意義,不就是為了簡化方法麼,從這點來說,構造動态Lamada非常必要。

部落客封裝了一個簡單操作(大于、等于、小于、like等)的動态Lamada類。

部落客項目中有某一個頁面,查詢條件非常多,需要傳遞到背景很多參數。先來看看頁面:

C#進階系列——動态Lamada

 來看背景web api代碼

倉儲基類裡面的find方法:

至此,所謂的動态Lamada就完了。如果你之前用過,請一笑而過;當然如果你沒用過,學習點新東西也是好的。請不要嘲笑部落客亂下定義,叫動态Lamada挺好的呢。當然你可以叫動态Expression,動态Linq都行,不管叫什麼,正确使用才是王道。

繼續閱讀