5

我已经下载了谓词构建器,并且很难让它与实体框架一起使用。这是我的代码: v_OrderDetail 是实体

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。

任何帮助是极大的赞赏。

4

1 回答 1

10

这是因为predicate.And不修改predicate,而是返回一个新的Expression<Func<v_OrderDetail, bool>>。您需要将结果分配到某处,以便您可以使用它。

如果您执行以下操作,它将起作用:

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

这里的问题是表达式树是不可变的。每次修改表达式树时,您都必须通过创建具有所需更改的全新表达式树来完成。

这是如何从 MSDN修改表达式树的相关摘录。

表达式树是不可变的,这意味着它们不能直接修改。要更改表达式树,您必须创建现有表达式树的副本,并在创建副本时进行所需的更改。您可以使用ExpressionVisitor类遍历现有的表达式树并复制它访问的每个节点。

于 2011-03-15T15:50:38.790 回答