2011-03-14 40 views
3

我已經下載了predicate builder,並且很難讓它與實體框架一起工作。這裏是我的代碼:v_OrderDetail是實體PredicateBuilder「和」方法不工作

var context = new OrdersEntities(); 

Expression<Func<v_OrderDetail,bool>> whereClause = w => true;           
var predicate = PredicateBuilder.True<v_OrderDetail>();    
predicate.And(w => w.Status == "Work");        
var results = context.v_OrderDetail.AsExpandable().Where(predicate); 

當我看結果,我回去每一個訂單。 And謂詞似乎並不需要。當我查看predicate.parameters.count時,它只顯示1.我不確定,但我希望它在添加第二個後顯示2。

任何幫助,非常感謝。

回答

9

這是因爲predicate.And沒有修改predicate,而是返回一個新的Expression<Func<v_OrderDetail, bool>>。您需要在某處分配結果,以便您可以使用它。

predicate = predicate.And(w => w.Status == "Work");  

這裏的問題是,表達式樹是不可變的:

,如果你做以下它將工作。每次修改表達式樹時,都必須通過創建具有所需更改的全新命令樹來完成。

以下是來自MSDN的How to modify expression trees的相關摘錄。

表達式樹是不可變的,這意味着它們不能被直接修改。要更改表達式樹,必須創建現有表達式樹的副本,並在創建副本時進行所需的更改。您可以使用ExpressionVisitor類遍歷現有的表達式樹並複製它所訪問的每個節點。