EntityFramework Core查询数据基本本质
【導(dǎo)讀】在EntityFramework Core中、當(dāng)查詢出數(shù)據(jù)后,是如何將數(shù)據(jù)映射給實(shí)體的呢?本節(jié)我們預(yù)先做個基本探討,后續(xù)給出其底層原理本質(zhì)
前不久,我們在探索性能時,給出利用反射達(dá)到性能瓶頸時的方案即使用委托,如下:
var?setId?=?(Action<Test,?int>)Delegate.CreateDelegate(typeof(Action<Test,?int>),?null,?typeof(Test).GetProperty("Id").GetSetMethod());上述我們通過委托方式來代替反射,可能我們也想到了另外一種方案,通過lambda構(gòu)建表達(dá)式的方式
查詢數(shù)據(jù)基本本質(zhì)
首先我們來看看如何手動構(gòu)建lambda表達(dá)式來獲取或設(shè)置數(shù)據(jù),廢話不多講,直接見代碼
public?static?Action<T,?object>?Set<T>(PropertyInfo?propertyInfo) {var?targetType?=?propertyInfo.DeclaringType;var?setMethod?=?propertyInfo.GetSetMethod();var?type?=?propertyInfo.PropertyType;var?target?=?Expression.Parameter(targetType,?"t");var?value?=?Expression.Parameter(typeof(object),?"d");var?condition?=?Expression.Condition(Expression.Equal(value,?Expression.Constant(DBNull.Value)),Expression.Default(type),Expression.Convert(value,?type));var?body?=?Expression.Call(Expression.Convert(target,?setMethod.DeclaringType),setMethod,condition);return?Expression.Lambda<Action<T,?object>>(body,?target,?value).Compile(); }當(dāng)我們獲取到數(shù)據(jù)庫數(shù)據(jù)時,緊接著需要將其對應(yīng)列數(shù)據(jù)賦值給對應(yīng)屬性,此時根據(jù)列類型需構(gòu)建表達(dá)式判斷條件(Condition),繼而調(diào)用其設(shè)置方法,最后構(gòu)建整體lambda進(jìn)行編譯執(zhí)行,對于獲取基本同理,不再解釋
public?static?Func<T,?object>?Get<T>(PropertyInfo?propertyInfo) {var?targetType?=?propertyInfo.DeclaringType;var?getMethod?=?propertyInfo.GetGetMethod();var?target?=?Expression.Parameter(targetType,?"t");var?body?=?Expression.Convert(Expression.Call(target,?getMethod),?typeof(object));return?Expression.Lambda<Func<T,?object>>(body,?target).Compile(); }那么問題來了,手動構(gòu)建lambda表達(dá)式和上述直接通過創(chuàng)建委托方式,哪種方式更佳呢?
單從代碼量上和所給例子來看,理論上是利用創(chuàng)建委托方式更佳,但是其潛在的問題是,通過創(chuàng)建委托,我們必須遍歷實(shí)體所有屬性,那么像上述利用lambda表達(dá)式難道就不用了?
事實(shí)上,完全不用,手動構(gòu)建lambda的好處在于,我們可手動構(gòu)建實(shí)體所有屬性,然后一次性賦值從而改善性能
至于如何一次性獲取對應(yīng)實(shí)體所有屬性,然后手動構(gòu)建lambda并賦值,這才是EntityFramework Core的妙處設(shè)計所在,后續(xù)文章我會詳細(xì)給出
手動構(gòu)建lambda的場景很多,再比如構(gòu)建自動化腳本,對lambda使用到爐火純青地步,那么自身整體核心競爭力將更上一臺階
?????是的,我的文章都是建立在基礎(chǔ)上的一點(diǎn)額外探索,比如微服務(wù)、k8s等等流行的玩意當(dāng)前還完全沒有涉及,一來實(shí)際項目中,還未應(yīng)用,二是,不愿淺嘗輒止,意義不大。萬變不離其宗,所有我們看過的代碼難道不都是語法組合嗎?
總結(jié)
以上是生活随笔為你收集整理的EntityFramework Core查询数据基本本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 93.7%的程序员!竟然都不知道Redi
- 下一篇: 万级 K8S 集群背后,etcd 如何保