c 分頁 C 表示式樹Lambda擴充套件(四)

2021-10-10 17:38:19 字數 2974 閱讀 7598

一、前言

本來計算這篇文章在後面需要運用的時候寫的,但是既然寫到表示式的擴充套件呢,就一起寫完吧。

看到這個標題就有一種疑問,lambda表示式本來就是表示式樹,還需要怎麼擴充套件?那就看看下面的內容,你就知道了。

表示式系列目錄

c# 表示式樹講解(一)

c# 表示式樹遍歷(二)

c# 表示式樹分頁擴充套件(三)

c# 表示式樹lambda擴充套件(四)

二、lambda擴充套件

這裡先不忙解答上面的問題,我們先看下這樣乙個應用場景。

乙個頁面的請求,裡面帶有一些條件查詢,請求類如下

public class scorerequest public string studentname }

要求查詢與課程名稱和學生名稱匹配的資料

資料來源我們就以上一例子的資料來源

資料來源類

新增資料

好了現在我們就查詢資料

如果查詢物件裡面coursename和studentname欄位都有值得話,這樣寫沒問題。如果沒值,那就最後的資料,就不準確了。

如果是直接拼湊sql語句,我們可以用if(string.isnullorempty())來判斷,但是現在判斷了,怎麼拼湊lambda表示式呢?

所以就需要我們對lambda表示式進行擴充套件,讓他支援這種情況。那上面的問題,就不用再專門回答了吧!!!!

建立乙個lambdaextension的類,**如下

public static class lambdaextension public static expression> false() public static expression> and(this expression> first, expression> second) public static expression> or(this expression> first, expression> second) private static expressioncompose(this expressionfirst, expressionsecond, funcmerge) ) .todictionary(p => p.s, p => p.f); var secondbody = pftparameterextension.replaceparameters(map, second.body); return expression.lambda(merge(first.body, secondbody), first.parameters); } private class pftparameterextension : expressionvisitor public pftparameterextension(dictionarymap) /// /// 替換引數 /// /// the map. /// the exp. /// expression public static expression replaceparameters(dictionarymap, expression exp) protected override expression visitparameter(parameterexpression p) return base.visitparameter(p); } } }

這裡面私有化了乙個表示式樹訪問器,他的作用主要是用來同步lambda表示式裡面的引數。

下面是呼叫方式

var expression = lambdaextension.true(); if (!string.isnullorwhitespace(request.coursename)) expression = expression.and(e => e.coursename.contains(request.coursename)); if (!string.isnullorwhitespace(request.studentname)) expression = expression.and(et => et.studentname.contains(request.studentname)); var resultdatas = datas.where(expression.compile()) .tolist(); console.writeline($"查詢結果:n "))}");

where條件裡面只能帶委託,而我們的expression是lambda表示式,所以需要compile進行委託編譯。

執行結果:

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...

C 表示式樹Lambda擴充套件(四)

本來計算這篇文章在後面需要運用的時候寫的,但是既然寫到表示式的擴充套件呢,就一起寫完吧。看到這個標題就有一種疑問,lambda表示式本來就是表示式樹,還需要怎麼擴充套件?那就看看下面的內容,你就知道了。表示式系列目錄 c 表示式樹講解 一 c 表示式樹遍歷 二 c 表示式樹分頁擴充套件 三 c 表示...

Lambda表示式表示式樹

在c 3.0中,繼匿名方法之後出現了lambda 表示式,使表達更為簡潔 快捷。lambda 表示式使用lambda 運算子 來定義,語法如下 引數列表 lambda 運算子的左邊是輸入引數,定義lambda表示式的接收引數列表,右邊包含表示式或語句塊,表示將表示式的值或語句塊返回的值傳給左邊的引數...