2010-05-12 34 views
4

如果聲明它,可以創建一個表達式樹。普通代碼的表達式結構

但是有可能得到一個普通的代碼塊,如方法或屬性getter的表達式樹?

我想要做的是,讓我們說一個訂單處理系統,我有訂單項目類:

class Item : Entity 
{ 
    [Cascade] 
    public Document document { get; set; } 
    public int line { get; set; } 

    public Product product { get; set; } 
    public string description { get; set; } 
    public decimal qty { get; set; } 
    public decimal price { get; set; } 
    public decimal net 
    { 
     get 
     { 
      return qty * price; 
     } 
    } 
    public VatCode vat_code { get; set; } 
} 

其中淨值等於數量*價格,所以我想使用屬性或方法聲明它,然後讓框架反省該表達式,以便它可以生成適當的SQL,以便在相應的數據庫視圖中定義相應的計算列。

這樣做最明顯的方法是獲取屬性獲取器或方法的表達式樹,但我找不到任何指示如何做到這一點,或者它是可能的。 (我已經找到了一種方法來獲得一個字節流的方法體,但這不是這裏所期望的。)

如果這是不可能的,我想推薦的解決方案是聲明類似靜態字段是一個表達式樹,並且在運行時編譯/運行它以供內部使用,並且對於SQL生成也是正常的內省?

回答

1

不,不可能 - 普通的代碼是字節碼,沒有機制把它變成表達式樹。你可以做的是使用反射 - 但基本上是這樣。

1

我一直在尋找一個類似的東西,我還沒有找到一個完美的方式來做到這一點,tbh。

另外一個問題,你可能遇到的,是即使你將有你想要的LINQ查詢注入表達式樹 - 這不是簡單的,當它聽起來那麼容易...

爲了實現這個目標,有一種方法是存儲一個靜態表達式,該表達式允許獲取「網絡」,並讓「net」屬性的getter對this運行此表達式。

如何在常規linq查詢中注入表達式? 我寫了一個關於它的blog post。基本上,我創建了一個表達式擴展器,它將使用自定義表達式更新L2S表達式樹::) Extending LINQ selectors with custom expressions