本來計算這篇文章在後面需要運用的時候寫的,但是既然寫到表示式的擴充套件呢,就一起寫完吧。
看到這個標題就有一種疑問,lambda表示式本來就是表示式樹,還需要怎麼擴充套件?那就看看下面的內容,你就知道了。
表示式系列目錄
c# 表示式樹講解(一)
c# 表示式樹遍歷(二)
c# 表示式樹分頁擴充套件(三)
c# 表示式樹lambda擴充套件(四)
這裡先不忙解答上面的問題,我們先看下這樣乙個應用場景。
乙個頁面的請求,裡面帶有一些條件查詢,請求類如下
public要求查詢與課程名稱和學生名稱匹配的資料class scorerequest
public
string studentname
}
資料來源我們就以上一例子的資料來源
資料來源類
publicview codeclass scoreclass
public
string studentname
public
decimal score
}
新增資料
var datas = new list();view codedatas.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
);
好了現在我們就查詢資料
var request = new scorerequest()如果查詢物件裡面coursename和studentname欄位都有值得話,這樣寫沒問題。如果沒值,那就最後的資料,就不準確了。;var resultdatas = datas.where(e => e.coursename.contains(request.coursename) && e.studentname.contains(request.studentname))
.tolist();
如果是直接拼湊sql語句,我們可以用if(string.isnullorempty())來判斷,但是現在判斷了,怎麼拼湊lambda表示式呢?
所以就需要我們對lambda表示式進行擴充套件,讓他支援這種情況。那上面的問題,就不用再專門回答了吧!!!!
建立乙個lambdaextension的類,**如下
public這裡面私有化了乙個表示式樹訪問器,他的作用主要是用來同步lambda表示式裡面的引數。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);}}
}
下面是呼叫方式
var expression = lambdaextension.true();where條件裡面只能帶委託,而我們的expression是lambda表示式,所以需要compile進行委託編譯。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 "))}");
執行結果:
仔細看**,第乙個條件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表示式的接收引數列表,右邊包含表示式或語句塊,表示將表示式的值或語句塊返回的值傳給左邊的引數...