8

LinqKit のPrediateBuilder クラスを使用して述語を作成し、フィルターを動的にセットアップしています。ネストされたものを別のものに結合したいと考えています。

私はこれを読みました(http://www.albahari.com/nutshell/predicatebuilder.aspx):

ここに画像の説明を入力

これが私のコードです:

// The main predicate.
var mainPredicate = PredicateBuilder.True<Document>();

// ... some other conditions to the main predicate here ...

// The inner predicate (combined conditions using OR).
var innerPredicate = PredicateBuilder.False<Document>();

foreach (var period in periods)
{
    var p = period;
    innerPredicate =
        innerPredicate.Or(
            d =>
            (d.Date >= p.DateFrom && d.Date <= p.DateTo));
}

mainPredicate = mainPredicate.And(innerPredicate);

documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();

ドキュメントで説明されているように、2 つの述語を組み合わせています。ただし、次の例外が発生します。

パラメーター 'f' は、指定された LINQ to Entities クエリ式でバインドされていませんでした

内部述語をメイン述語と結合する前に展開する必要があると最初に考えたので、結合コードを変更して、次のように内部述語のExpandメソッドへの呼び出しを追加しました。

mainPredicate = mainPredicate.And(innerPredicate.Expand());

しかし、まったく同じ例外が発生します。

私のコードとドキュメントの唯一の違いは、ループを使用しforeachてネストされた述語を動的に構築することです。結果の式にどのように悪影響を与えるかはわかりません。

  • 私のコードの何が問題になっていますか?

  • これを実際にデバッグするにはどうすればよいですか?

  • fパラメータの由来は? どのように生成されますか? 私の場合、なぜ問題になるのですか?

  • 結果の式の何が問題なのかを実際に確認するのに役立つ、ある種の式ツリービジュアライザーはありますか? 式の本体が読みにくいためです。

4

1 に答える 1