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パラメータの由来は? どのように生成されますか? 私の場合、なぜ問題になるのですか?
結果の式の何が問題なのかを実際に確認するのに役立つ、ある種の式ツリービジュアライザーはありますか? 式の本体が読みにくいためです。