接續[上篇之預告]
本篇來講講,如何根據前面設計的查詢描述器構造出可執行的表示式。正如標題所示,實現手段將採用Expression Lambda技術。
先來看看主角System.Linq.Expressions.Expression
長什麼樣,都有些什麼東西,能做什麼。 先看看它的類圖:
System.Linq.Expressions.MemberExpression 成員(屬性或欄位)
我們主要使用Expression
這個類,它包含各種節點型別的 static
工廠方法。特別是以下這些方法,對應了查詢需要用到的邏輯、比較、數學,等各種運算操作。
以上僅列出了一部分,它涵蓋了全部可能要使用到的函數,語句,欲詳細瞭解可以直接乘坐火箭到微軟官方網站檢視。
這此函數或功能是有了,如何使用呢?來看個例子:將SQL
:Table1.A > 5 and Table1.B=3
,轉成(Table1)=>Table1.A > 5 && Table1.B==3
;
在Expression
的世界裡一切都是Expression
Table1
、A
、5
、B
、 3
先包裝成Expression
:
//實體類:
public class Table
{
public int A;
public int B;
}
Expression
//將Table1包裝成ParameterExpression:
var p=Expression.Parameter(typeof(Table1),"Table1");
//將5、3這兩個常數包裝成ConstantExpression:
var num5=Expression.Constant(5,typeof(int));
var num3=Expression.Constant(3,typeof(int));
//將兩個屬性包裝成MemberExpression。
var a=Expression.PropertyOrField(p,"A")
var b=Expression.PropertyOrField(p,"B")
//構造Table1.A>5:
var gt=Expression.GreaterThen(a,num5);
//構造Table1.A=3:
var eq=Expression.Equal(b,num3);
//構造Table1.A>5:
var gt=Expression.GreaterThen(a,num5);
//構造Table1.A=3:
var eq=Expression.Equal(b,num3);
And
將兩個比較式連線起來 //構造Table1.A>5 && Table1.A=3
var exp=Expression.AndAlso(gt,eq);
//結果就獲得了:
var lambda=Expression.Lambda()
/*===============來來來,測試一下:===============*/
var f=lambda.Compile();
var x=f.DynamicInvoke(new Table(){A=6,B=3});
var y = f.DynamicInvoke(new Table() { A = 2, B = 3 });
Console.WriteLine("x:{0}\ny:{1}",x,y);
Console.WriteLine("Lambda:{0}",lambda.ToString());
/*輸出:
結果對嗎?我也不知道,我擼得這麼辛苦,先讓電腦休息一下,各位看官只要Ctrl+C,Ctrl+V就可以看到了.
*/