2017-08-02 44 views
0

我試圖創建一個簡單的表達我有這樣的簡單類型:簡單表達式組合

public class BSType 
{ 
    public int Length { get; set; } 
    public string Name { get; set; } 
} 

中,我試圖動態創建過濾器表達式,這將是

(bsType) => bsType.Length == 3 

我創建了一個表達式,它返回給我的常量3

var right = Expression.Constant(3); 

然後我有另一個表達式,我的Func<BSType, int> S的看起來像這樣

Expression<Func<BSType, int>> left = bsType => bsType.Length; 

當我嘗試向他們提供平等的表達,像這樣

Expression.Equal(left, right); 

比較我得到一個錯誤:

The binary operator Equal is not defined for the types 'System.Func`2[ExpressionBuilder.BSType,System.Int32]' and 'System.Int32'

我覺得我需要將類型的參數傳遞給函數的左側,以便它可以解析長度,但我不確定如何這樣做,任何人都可以指向正確的方向?

+0

我已經更新了我的問題,以顯示大致發生了什麼 –

+0

' Expression >''你不需要提取int的一部分,這樣'left'是一個'int'而不是'Expression >'? –

+0

@TZZA耶我該怎麼做?以某種方式生成可以與實體框架工作的表達式 –

回答

0

你試圖表達的其中一個發生在一個FUNC作爲參數,而不是與表達體結合,像這樣結合:

Expression.Equal(left.Body, right) 
+1

'left'是OP代碼中的'Expression >',而不是'Func <...>'。此外,你的代碼實際上並不是按照它應該的方式組合表達式,它只是構造一個硬編碼的表達式,而不用任何表達式,然後將它們組合起來。 – Servy

+0

我不是說'left'是'Func <>',它是一個表達式,每個表達式都有返回類型。在原來的問題返回類型'left'是'Func <>'。我的代碼有什麼問題?它構造了請求的表達式並且工作。 – Zergatul

+0

表達式不會「返回」任何內容。表達式是一些代碼的表示。你可以說它代表的代碼返回一個'int'。它當然不會返回一個'Func'。您的代碼只是爲給出的一個示例構造一個硬編碼結果,而不是解決問題要求解決的問題。這就好像有人問你如何將兩個數字加在一起,比如說2和5,並且你寫了一個只返回7的方法,並說「它爲你的例子返回正確的結果」。這是真的,但它並沒有解決問題的實際問題。 – Servy