PredicateBuilder "И" Метод не работает - PullRequest
3 голосов
/ 15 марта 2011

Я скачал построитель предикатов и мне трудно заставить его работать с платформой сущностей. Вот мой код: 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, похоже, не принимает. Когда я смотрю на предикат.parameters.count, он показывает только 1. Я не уверен, но я ожидаю, что он покажет 2 после добавления второго.

Любая помощь очень ценится.

1 Ответ

9 голосов
/ 15 марта 2011

Это потому, что predicate.And не изменяет predicate, вместо этого он возвращает новый Expression<Func<v_OrderDetail, bool>>. Вам нужно назначить результат где-нибудь, чтобы вы могли использовать его.

Это будет работать, если вы сделаете следующее:

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

Проблема здесь в том, что деревья выражений неизменны. Каждый раз, когда вы изменяете дерево выражений, вы должны делать это, создавая новое с необходимым изменением.

Вот соответствующая выдержка из Как изменить деревья выражений из MSDN.

Деревья выражений являются неизменными, что означает, что они не могут быть изменены напрямую. Чтобы изменить дерево выражений, необходимо создать копию существующего дерева выражений и при создании копии внести необходимые изменения. Вы можете использовать класс ExpressionVisitor для обхода существующего дерева выражений и копирования каждого посещаемого узла.

...