2010-03-23 98 views
0

我正在嘗試構建表達式樹(still),但進一步得到了!我需要創建一個BinaryExpression以執行成員與項目集合之間的「In」比較。因此,如果成員包含在項目中,表達式應該返回true。「In」操作的表達式樹二進制表達式

這顯然不存在:

Expression.MakeBinary(ExpressionType.In, memberExpression, constantExpression); 

constantExpressionIEnumerable<T>類型的ConstantExpressionmemberExpressionTMemberExpression

我將如何創建這樣一個表達式?

回答

3

你通常會使用「包含」,而不是 - 這就是你通常如何編寫LINQ查詢這將映射到SQL「IN」:

var query = from user in db.Users 
      where specialUsers.Contains(user.Name) 
      select user.Id; 
+0

這是我的第一個想法,但我對如何將這樣的LINQ查詢翻譯成表達式樹感到失落。 – 2010-03-23 16:27:36

+1

@Adam:最簡單的做法是嘗試一下:)創建一個表達式,然後使用Reflector來查看編譯器完成了什麼。基本上會有一個調用Queryable.Where的表達式,該表達式表示對常量('specialUsers'集合)上的'Contains'的調用,它傳入了評估過的'user.Name'作爲參數。 – 2010-03-23 16:30:16

+0

沒有意識到LINQ編譯出來的方式。這應該爲我節省一些時間。謝謝! – 2010-03-23 17:01:56

2

只是想增加怎麼我最終得到了這個工作:

var callExpression = Expression.Call(typeof(Enumerable), "Contains", new Type[] {memberExpression.Type}, constantExpression, memberExpression); 

編譯和調用callExpression將產生memberExpression是否是在constantExpression集合中。