一步步實現自己的ORM(五)

2022-03-29 23:44:21 字數 3367 閱讀 9580

讓我們先來看下expression 表示式如何將datareader轉換成object:

idatareader reader = null

; expression

> expr = (r) => new

user()

;var func =expr.compile();

func(reader);

在new user的時候採用物件初始化方式給屬性賦值,而在實際專案中我們會遇到更複雜的,比如還要判斷是否為dbnull,要不然轉換會出錯,在這裡我定義乙個getvalue(int i)方法,專門做取值操作。

class

dbfieldreader

public t getvalue(int

index)

}

現在將**修改下,

idatareader reader = null

; dbfieldreader fr = new

dbfieldreader(reader);

expression

> expr = (r) => new

user()

;var func =expr.compile();

func(fr);

是不是簡潔了很多?把判斷**轉移到dbfieldreader類中處理,現在我們要將這個方法做成通用實體類轉換,先分解下expression表示式(如吐有錯誤,懇請大神指教)。

第一步定義引數,型別為dbfieldreader,引數名:r

parameterexpression parexpr = expression.parameter(typeof(dbfieldreader), "

r");

第二步,呼叫user類的建構函式,**如下:

var newexpr = expression.new(type.getconstructors().first());
合併這2個表示式和執行結果:

基本的雛形出來了,現在要做的就是給屬性賦值,怎麼來呢?先來個簡單的,就是給固定值。

var userid = expression.bind(type.getproperty("

userid

"), expression.constant(1, typeof(int)));

這就相當於userid = 1的賦值操作,繼續合併表示式:

常量賦值沒問題後,下面就要來呼叫方法了。

var method = typeof(dbfieldreader).getmethods().where(c => c.name == "

getvalue

" &&c.isgenericmethod).first();

var callexpr = expression.call(parexpr, method.makegenericmethod(typeof(int)), expression.constant(0));

var userid = expression.bind(type.getproperty("userid"), callexpr);

這句話相當於 r.getvalue(0);

先獲取getvalue方法,然後呼叫makegenericmethod生成泛型方法,expression.constant(0)就是引數值。

完整版**:

idatareader reader = null

; dbfieldreader fr = new

dbfieldreader(reader);

parameterexpression parexpr = expression.parameter(typeof(dbfieldreader), "r"

);

var method = typeof(dbfieldreader).getmethods().where(c => c.name == "

getvalue

" &&c.isgenericmethod).first();

list

memberbindings = new list();

int index = 0

;

foreach (var item in

var init =expression.memberinit(newexpr, memberbindings);

expression

> expr = (expression>)expression.lambda(init, parexpr);

當然我們還需要修改sql語句,不能用select * 語法,而是要用select userid,email...from這樣的語法

一步步實現自己的ORM(一)

最近在研究orm,嘗試著自己開發了乙個簡單的orm。我個人不喜歡ef因為跟不上ef公升級太快了,再說公司裡還停留在c 3.5時代,對於nhibernate配置太複雜看到就頭暈,就心生自己做乙個orm的念頭,現在把開發過程中的點點滴滴記錄下來,供自己和新手參考,大神請直接忽略這篇文章。create t...

一步步實施 DevOps (五)

一步步實施 devops 一 一步步實施 devops 二 一步步實施 devops 三 一步步實施 devops 四 自動化部署 本章節重點談自動化部署,每個人對自動化部署都有自己的理解,每個企業對自動化部署的需求也不同。目前很多雲平台開始推出一些列 devops 工具,體驗了一下,仍然處在初級階...

自己怎麼一步步喜歡程式設計

在夜深人靜的時候我整理一下思緒 自己當年是如何從愛玩遊戲的小孩子一步步成長為一名熱愛程式設計的程式設計師。1 玩電腦 要程式設計就要觸到電腦,我喜歡電腦原因很簡單,我喜歡玩遊戲。一開始家裡沒電腦就跑去親戚家玩。人們都說玩遊戲是學電腦最慢 最傻的辦法。但是我必須要再新增一句 也是最有效的辦法。乙個事物...