處理表達(dá)式樹(shù)可以說(shuō)是所有要實(shí)現(xiàn)Linq To SQL的重點(diǎn),同時(shí)他也是難點(diǎn)。筆者看完作者在LinqToDB框架里面對(duì)于這一部分的設(shè)計(jì)之后,心里有一點(diǎn)不知所然。由于很多代碼沒(méi)有文字注解。所以筆者只能接合上下代碼來(lái)推斷出作者大概在做什么。但是有些筆者只知道在做什么卻很難推斷出作者為什么要這么做。這一部分的主要核心類(lèi)有倆個(gè)——Query<T>類(lèi)和ExpressionBuilder類(lèi)。可以用一句話來(lái)形容:由Query<T>類(lèi)起也由Query<T>類(lèi)落。
處理優(yōu)化表達(dá)樹(shù)
上一章我們能知道執(zhí)行最后的操作一定是要通過(guò)Query<T>類(lèi)實(shí)例來(lái)完成的。而Query<T>類(lèi)又必須通過(guò)ExpressionBuilder類(lèi)來(lái)獲得的。很顯然他們倆個(gè)之間的關(guān)系很復(fù)雜。但是有一點(diǎn)可以肯定——最后的工作都會(huì)交給Query<T>類(lèi)的GetElement方法和GetIEnumerable方法。在Query<T>類(lèi)的構(gòu)造函數(shù)里面一開(kāi)始就把GetIEnumerable方法賦于MakeEnumerable方法。
public Query() { GetIEnumerable = MakeEnumerable; }
也許是筆者理解上的錯(cuò)誤——發(fā)現(xiàn)GetIEnumerable最后還會(huì)被別的方法取代。也就是說(shuō)MakeEnumerable方法并沒(méi)有被執(zhí)行。但是MakeEnumerable方法的作用卻明顯就調(diào)用GetElement方法最后轉(zhuǎn)化成需要的結(jié)果。可以看出對(duì)于實(shí)例化Query<T>類(lèi)并沒(méi)有過(guò)多復(fù)雜的操作。但是獲得Query<T>類(lèi)實(shí)例卻要用自身的靜態(tài)方法GetQuery來(lái)進(jìn)行。如果直接實(shí)例Query<T>類(lèi)的話,筆者也不覺(jué)得復(fù)雜。主要是他還要通過(guò)ExpressionBuilder類(lèi)的進(jìn)行加工。這一點(diǎn)讓筆者有一種深入迷宮的快感。去掉那些緩存代碼。讓我們把重點(diǎn)移到迷宮口。
Query<T>類(lèi):
query = new ExpressionBuilder(new Query<T>(), dataContextInfo, expr, null).Build<T>();
ExpressionBuilder類(lèi)的構(gòu)造函數(shù)的參數(shù)很簡(jiǎn)單——Query<T>類(lèi)實(shí)例、數(shù)據(jù)上下文信息、當(dāng)前表達(dá)式樹(shù)。最后一參數(shù)跟LinqToDB框架的另一個(gè)功能有關(guān)系——CompiledQuery功能。所以如果你一直用Linq To SQL的話,最后一個(gè)參數(shù)一直是null。參數(shù)理解起來(lái)并不難??墒菢?gòu)造函數(shù)里面的代碼卻讓筆者很頭痛。筆者只能知道做什么卻很難理解為什么要這樣子做。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26