[Expression Tree] 取得IQueryable的查詢欄位

  專案上有一需求,要提供一個共用方法,取得IQueryable<T>的查詢欄位,基本上若要取得欄位的話,只要透過type的GetProerties就可以取到。如下測試

Foo類別

image

測試程式,取得IQueryable內的屬性集合。

image

如上圖紅框,得到了4個屬性,但這不是我想要的結果,我只想要ID,OPTYPE這兩個被Select所回傳的欄位。

image

解決方式

   IQueryable本身有一個Expression屬性,我們可以透過它取到運算式樹狀架構來表示該查詢。根據需求是要取得欄位設定的節點(MemberAssignment)(如上圖紅框)。本來一開始想說要用遞迴方式來取得該節點,想想這樣太累了,查了一下MSDN後,果然有一個ExpressionVisitor類別,可以幫我作這件事XD。
此類別只要呼叫Visit(),就會巡覽Expression的所有節點,所以透過覆寫VisitMemberAssignment方法,在每次的欄位指派被呼叫時,就可以收集被Select的欄位。
image

測試如下

  1. 查詢ID及OPTYPE 2個欄位
  2. 透過ExpressionVisitor 巡覽IQueryable查詢的欄位
  3. 顯示Foo比對的到欄位名稱
image

image

參考來源

https://msdn.microsoft.com/en-us/library/bb882521(v=vs.90).aspx

這個網誌中的熱門文章

IIS 設定只允許特定IP進入