2013-07-28 31 views
3

我正在嘗試將LinqExpression轉換爲sql語句。例如,在我的Repository基類中,我有一個方法Find,它接受LinqExpression作爲它的參數。在查找方法,我呼籲執行以下操作的方法:LinqExpression:如何從比較評估中獲得價值

var equality = expression as BinaryExpression; 
       return equality.Left.Translate() + " = " + 
         equality.Right.Translate(); 

我怎樣才能在右側的變量的值,而不僅僅是變量名,目前我只得到變量名稱。恩。 Find(x => x.ID = variable);如果變量當前設置爲7我需要一種方法來獲取值7而不是名稱變量。什麼纔是正確的方法來獲得存儲在變量中的值?

回答

0

嘗試分別鑄造成MemberExpressionConstantExpression

var memberExpression = (MemberExpression) expression.Left; 
    var constantExpression = (ConstantExpression) expression.Right; 

哦,錯過了它是一個變量。然後右操作數應該是ParameterException。但是,要獲得它的價值,您可以使用

Func<object> getValue = expression.Compile(); 
var value = getValue(); 

請注意,這可能會很慢。

+0

除了這種情況,'expression.Right'似乎被捕獲到了閉包變量,而不是一個常量。這意味着它不會是'ConstantExpression'。 – svick

+0

是的,你是對的。我錯過了它是一個變量。所以它應該是_ParameterExpression_。 – mkoertgen

1

看一看Matt Warren's article LINQ: Building an IQueryable Provider - Part III。它包含Evaluator類的代碼,它將內聯所有可以內聯的值。在你的情況下,它將取代variableConstantExpression,其中包含值7.

該系列文章的其餘部分也可能是你感興趣的。

+0

在使用_Expression.Compile()_之前試圖在本地評估表達式,就像引用的文章中討論的那樣是一個好主意。 – mkoertgen