如果你有 *n* 個緩存伺服器,一個常見的負載均衡方式是使用以下的哈希方法: *伺服器索引 = 哈希(鍵) % N*,其中 *N* 是伺服器池的大小。 讓我們通過一個例子來說明這是如何工作的。如表5-1所示,我們有4台伺服器和8個字元串鍵及其哈希值。 ![image-2023052022160981 ...
接續[上篇之預告]
本篇來講講,如何根據前面設計的查詢描述器構造出可執行的表達式。正如標題所示,實現手段將採用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就可以看到了.
*/
- OK,其它各種操作,只要依葫蘆畫瓢便大功可成! 先爽一下!
- 好,暫且爽到這裡,欲看如何把括弧弄成俄羅斯套娃,且看下回分解.
- 隨手點個贊,讓我也爽爽,可好!