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