Это потому, что predicate.And
не изменяет predicate
, вместо этого он возвращает новый Expression<Func<v_OrderDetail, bool>>
. Вам нужно назначить результат где-нибудь, чтобы вы могли использовать его.
Это будет работать, если вы сделаете следующее:
predicate = predicate.And(w => w.Status == "Work");
Проблема здесь в том, что деревья выражений неизменны. Каждый раз, когда вы изменяете дерево выражений, вы должны делать это, создавая новое с необходимым изменением.
Вот соответствующая выдержка из Как изменить деревья выражений из MSDN.
Деревья выражений являются неизменными, что означает, что они не могут быть изменены напрямую. Чтобы изменить дерево выражений, необходимо создать копию существующего дерева выражений и при создании копии внести необходимые изменения. Вы можете использовать класс ExpressionVisitor для обхода существующего дерева выражений и копирования каждого посещаемого узла.