[Expression Tree] 取得IQueryable的查詢欄位
Foo類別
測試程式,取得IQueryable內的屬性集合。
如上圖紅框,得到了4個屬性,但這不是我想要的結果,我只想要ID,OPTYPE這兩個被Select所回傳的欄位。
解決方式
IQueryable本身有一個Expression屬性,我們可以透過它取到運算式樹狀架構來表示該查詢。根據需求是要取得欄位設定的節點(MemberAssignment)(如上圖紅框)。本來一開始想說要用遞迴方式來取得該節點,想想這樣太累了,查了一下MSDN後,果然有一個ExpressionVisitor類別,可以幫我作這件事XD。此類別只要呼叫Visit(),就會巡覽Expression的所有節點,所以透過覆寫VisitMemberAssignment方法,在每次的欄位指派被呼叫時,就可以收集被Select的欄位。
測試如下
- 查詢ID及OPTYPE 2個欄位
- 透過ExpressionVisitor 巡覽IQueryable查詢的欄位
- 顯示Foo比對的到欄位名稱