正如orm名稱所指示的,實現orm的關鍵點在於解決「物件--關係」之間的對映,例如,如何將乙個datarow轉換為乙個entity object,又如何將乙個對某entity object的操作對映到乙個idbcommand,等等。我們以datarabbit為例,
public
inte***ce
<
tentity
>
1.**生成器
2.反射
將乙個datarow轉換為乙個entity object,如果粒度更細一點,我們實際要解決的是如何將datarow的一列的值賦值給entity object對應的屬性,我們可以使用反射在執行時給entity object的屬性賦值,如:
entitytype.invokemember(columnname,bindingflags.public
|bindingflags.ignorecase
|bindingflags.instance
|bindingflags.setproperty,
null
,entity,row[columnname]);
這行**的含義是將row中【columnname】列的值賦值給entity物件的【columnname】屬性。
3.emit
private
void
emitgetentityfrommethod(typebuildertypebuilder,methodinfobasemethod,typeentitytype,dataschemadataschema)
));ilgenerator.emit(opcodes.stloc_0);
//member=newmember();
ilist
<
propertyinfo
>
bloblist
=new
list
<
propertyinfo
>
();#region
為非blob屬性賦值
foreach
(propertyinfoproperty
inentitytype.getproperties())
if((property.propertytype
==typeof
(byte
))&&(!
columnschema.istimestamp))
emitsetproperty(entitytype,ilgenerator,property);
}#endregion
if(bloblist.count
>0)
#endregion
}ilgenerator.marklabel(retlabel);
ilgenerator.emit(opcodes.nop);
ilgenerator.emit(opcodes.ldloc_0);
ilgenerator.emit(opcodes.ret);
typebuilder.definemethodoverride(methodbuilder,basemethod);
//定義方法過載}
4.使用lamda表示式
如果是在.net3.5上,我們可以使用動態生成的lamda表示式來完成entity object屬性的賦值操作,關鍵點是要如何生成用於賦值的動態委託。比如:
private
action
<
tentity,
object
>
createfunctionofsetproperty
<
tentity
>
(methodinfosetpropertymethod,typecolumntype);}
這個方法返回乙個委託,返回的委託接收兩個引數--entity object 和要賦的屬性值,呼叫這個委託便可以為entity object的某個屬性進行賦值。
好了,四種方案已經簡單介紹完畢,下面我們來比較一下。
(1)除了第一種方案是在編譯期完成外,後面三種方案都是在執行期完成的。
(2)第一種方案的效率是最高的,但是所需的手工操作也是最多的(比如每次修改了表結構都需要重新生成dal層)。第二種方案的效率是最低的,反射使效率的折損非常之大。後兩種方案的效率都不錯(幾乎接近第一種方案)。
(3)emit方案的實現難度應當是最大的,其次是lamda表示式方案。
(4)lamda表示式方案在.net3.5及以上平台才可使用。
datarabbit 3.x及之前版本採用的是emit方案,後續的4.0及以上版本則對emit方案和lamda表示式方案都支援(預設為emit方案,可以修改配置選項使之採用lamda表示式方案)。
Hadoop MongoDB的四種方案
背景 公司核心業務庫現存在mongodb中,分布在6臺mongodb節點。現面臨如下問題 1.最大的一張表有10多個g,mongodb在查詢方面尚能勝任,但是涉及到複雜計算時會比較吃力。2.mongodb中有三張表,分別記錄了終端使用者在三個不同系統 遊戲,桌牌等 的行為,需要按使用者匯聚成一張表。...
四種CDC方案比較
抽取處理需要重點考慮增量抽取,也被稱為變化資料捕獲,簡稱cdc。假設乙個資料倉儲系統,在每天夜裡的業務低峰時間從操作型源系統抽取資料,那麼增量抽取只需要過去24小時內發生變化的資料。變化資料捕獲也是建立準實時資料倉儲的關鍵技術。當你能夠識別並獲得最近發生變化的資料時,抽取及其後面的轉換 裝載操作顯然...
CSS四種方案實現 居中布局
不定寬元素的居中對齊 方案一 text align center display inline block css html demo 效果 優點 1.相容性好,相容ie 6 7只需對元素 display 屬性修改為 inline 缺點 child 會繼承 parent 的text align ce...