2010-07-20 50 views
5

我正在研究由同事編寫的一些表達式樹代碼,並且正在研究添加其他表達式的可能性。它目前支持:equals,not-equals,IsNull等。我需要添加一些可以使用類似於SQL「Like」命令或使用正則表達式的通配符比較。目前代碼解析XML文件並提取數據,然後使用類似於下面顯示的代碼的代碼進行處理。這是「平等」表達的一個例子。 「callExp」是一個基本上保存我的表的字段名稱(Entities)的MemberExpression,GetConstantExpression獲取我正在比較的數據的詳細信息。如何創建表達式樹來執行類似於SQL「Like」命令的操作

xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element("Value"), callExp.Type)); 

我所追求的是一種創建類似於「Like」命令的「表達式」的方法。這可以使用類似於上面的幾行來完成,還是會變得更復雜?任何可以幫助這個領域的好資源?

============================================== ====================================

基於反饋的新代碼:

我正在看一些例子,並嘗試了以下內容,希望能爲我創建一個表達式。它給了我下面顯示的錯誤。我是否正確地創建了「StartsWith」表達式? _entityExp是對MyClass的ParameterExpression引用。在類型 'System.String'

ParameterExpression p = Expression.Parameter(_entityExp.Type, "entity"); 
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); 
var containsMethodExp = Expression.Call(p, method, Expression.Constant("root"), p); 

方法 '布爾StartsWith(System.String)' 宣佈不能與類型 'MyClass的'

回答

7

表達式樹可以只表示與.NET語言相同的功能 - 方法調用,屬性評估等。

通常最接近「like」的地方是致電string.StartsWithstring.EndsWith o r string.Contains。如果您想要處理正則表達式,則可能需要使用Regex.IsMatch。無論如何,這是封裝在方法而不是表達式樹本身的「語言」中的東西。

不知道你的表達樹是如何被消耗的,你很難確切地說你應該做什麼。你可以使用創建你自己的「Like」方法,消費者會注意並適當地處理,例如......或者你可以使用現有的字符串/正則表達式方法。

+0

我已決定讓「StartsWith」工作。我編輯了上面的代碼,但是出現錯誤。我是否正在朝着正確的方向前進? – Retrocoder 2010-07-20 15:19:59

+0

@Retrocoder:不,錯誤是非常正確的。你正試圖調用'string.StartsWith(string)',但提供一個非字符串參數。您可以將參數更改爲字符串,也可以使用您需要的簽名編寫自己的「StartsWith」方法。 – 2010-07-20 16:12:22

相關問題