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つ目を追加すると、2が表示されると思います。

どんな助けでも大歓迎です。

4

1 に答える 1

10

predicate.And変更しないため、代わりにpredicatenewを返しますExpression<Func<v_OrderDetail, bool>>。結果を使用できるように、どこかに結果を割り当てる必要があります。

次のようにすると機能します。

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

ここでの問題は、式ツリーが不変であるということです。式ツリーを変更するたびに、必要な変更を加えた新しいツリーを作成して変更する必要があります。

これは、MSDNの式ツリーを変更する方法からの関連する抜粋です。

式ツリーは不変です。つまり、式ツリーを直接変更することはできません。式ツリーを変更するには、既存の式ツリーのコピーを作成する必要があります。コピーを作成するときに、必要な変更を加えます。ExpressionVisitorクラスを使用して、既存の式ツリーをトラバースし、アクセスする各ノードをコピーできます。

于 2011-03-15T15:50:38.790 に答える