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

2022-07-04 14:42:09 字數 3297 閱讀 2620

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

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

表示式系列目錄

c# 表示式樹講解(一)

c# 表示式樹遍歷(二)

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

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

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

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

public

class scorerequest

public

string studentname

}

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

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

資料來源類

public

class scoreclass

public

string studentname

public

decimal score

}

view code

新增資料

var datas = new list();

datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);datas.add(new scoreclass

);

view code

好了現在我們就查詢資料

var request = new scorerequest()

;var resultdatas = datas.where(e => e.coursename.contains(request.coursename) && e.studentname.contains(request.studentname))

.tolist();

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

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

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

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

public

static

class lambdaextension

public

static expressionbool>> false()

public

static expressionbool>> and(this expressionbool>> first, expressionbool>> second)

public

static expressionbool>> or(this expressionbool>> first, expressionbool>> 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進行委託編譯。

執行結果:

仔細看**,第乙個條件and裡面的引數是「e」,第二個條件裡面的引數是et,同乙個lambda表示式裡面(這裡只有乙個引數),引數肯定是一致的,所以在lambdaextension類中,在合併兩個lambda表示式的時候,就需要將引數合併成乙個。

經過這樣的擴充套件,我們就可以根據我們的實際情況,拼湊好需要的表示式,得到我們想要的結果。

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

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

Lambda表示式和Lambda表示式樹

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

Lambda表示式表示式樹

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