Linq表達樹(固定引數)

2022-01-14 10:28:04 字數 2148 閱讀 7903

這篇部落格只能用來批判因為我剛剛學習linq對它了解只有簡單的linq to sql 的語句所以來寫這個部落格只能說是班門弄斧了,看的下去的話就堅持看吧。

描述:表示式樹是將我們原來可以直接由**編寫的邏輯以表示式的方式儲存在樹狀的結構裡,從而可以在執行時去解析這個樹,然後執行,實現動態的編輯和執行**。

示例:voidmain()

如果用console.writeline(tree

.tostring());// x=> (x + 1)輸出結果是x=> (x + 1)tree只是lambada表示式的樹形結構資訊,並不是函式可以直接呼叫

上面的expression>tree =x=>x+1;

左面expression>tree 是乙個樹,

右面x=>x+1是乙個表示式,func中的兩個型別是這樣的最後乙個型別是返回值的型別前面的是引數型別對於表示式x=>x+1來說引數x型別為int最後

計算結果返回值型別也會是int。而

func

<

int,

int>又是作為expression

中的型別它的型別是乙個表示式

,就好像這個樹是由最底層的單個

引數和一些邏輯操作,運算操作等一級一級構成(這是我個人目前的理解不對請指正)

但是不管怎麼構建這棵樹我們的目的還是要使用它的,所以怎樣使用呢?

那就是compile()函式了,它由expression類提供,下面是使用:

funcfun=tree.compile();

fun(3).dump();//用來輸出

上面可能不直觀那看下面:

constantexpression ce1 = expression.constant(10);//這個沒有什麼好疑義的就是返回10這個常量

expression> exp = expression.lambda>(ce1);

console.writeline(exp.compile().invoke());

下面我們來看怎樣構建乙個表示式樹:

首先看幾個型別

下面看**:(直角三角形的判斷)

1.建立引數

parameterexpression expx=expression.parameter(typeof(int),"x");

parameterexpression expy=expression.parameter(typeof(int),"y");

parameterexpression expz=expression.parameter(typeof(int), "z");

2.計算

binaryexpression mulx =expression.multiply(expx, expx);

binaryexpression muly=expression.multiply(expy, expy);

binaryexpression mulz=expression.multiply(expz, expz);

binaryexpression addxy =expression.add(mulx,muly);

3.最後的關聯

binaryexpression final=expression.equal(mulz, addxy);

如果感覺欠缺點什麼,那麼看下面我們把它放到程式main中是不是更直觀一點呢?

voidmain()

結果:true

似乎明白了一些吧,但是感覺還是不夠清晰不夠有條理性,因為目前能力有限只能零星的了解等進一步的學習後希望會有乙個系統的深入了解。

後面的任意引數構建、以及樹的遍歷還會抽時間學習,最近確實時間不夠多,只能抽時間看看,人家一小時學會那麼我就話更多的時間去學,可

能我個人速度慢消化的少但是會繼續努力,我相信總會學會的。之後還會繼續追加內容的。

LINQ 表示式樹 Expression

在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...

LINQ 表示式樹 Expression

在 linq to objects 中,擴充套件方法需要將乙個委託型別作為引數,這樣就可以將 表示式賦予引數。達式也可以賦予expression型別的引數。expression型別指定,來自於 表示式的表示式樹儲存在程式集中。這樣,就可以在執行期間分析表示式,並進行優化,以便於查詢資料來源。下面看看...

c 表示式樹在LINQ動態查詢

一般如果邏輯比較簡單,只是存在有的情況多乙個查詢條件,有的情況不需要新增該查詢條件 簡單方式這樣操作就可以了 csharp view plain copy public iqueryabledynamicchainedsyntax iqueryablefiles,bool pastonly 這裡的多...