を使用してフィルタとして機能するようにカスタム述語の構築:は私が<code>foreach</code>ループを使用して動的に<strong>ビルド</strong>に苦労していたカスタムフィルタに渡すことにより、ドキュメントのリストをフィルタリングする必要があるforeachループ
var mainPredicate = PredicateBuilder.True<Document>();
// mainPredicate is combined to other filters successfully here ...
var innerPredicate = PredicateBuilder.False<Document>();
foreach (var period in periods)
{
var p = period;
Expression<Func<Document, bool>> inPeriod =
d => d.Date >= p.DateFrom && d.Date <= p.DateTo;
innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
}
mainPredicate = mainPredicate.And(innerPredicate);
この最後の行:
documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
はこの例外をスローします:
パラメータ 'd'は、指定されたLINQ to Entities クエリ式でバインドされていませんでした。
なぜこの例外が発生するのですか? InPeriodメソッドに渡す 'd'パラメータがどこに失われるのか分かりません。私はこれが機能するために何が欠けているのか分からない。私のコードは完璧に動作する他の多くの例と同じです。表現を呼び出すことについての理論的な情報や、その背後でどのように動作するかについての理論的な情報は歓迎されます。
'mainPredicate.Expand()。Compile()。Invoke(someDocument)'を実行するとどうなりますか?あなたは問題が他の場所ではないと確信していますか? – svick
あなたの提案があれば、最後の行を次のように変更しました: 'documentEntries = this.ObjectSet.AsExpandable()。where(de => mainPredicate.Expand()。Compile()。Invoke(de))。ToList() ); 'しかし、それは:LINQ to Entitiesはメソッド 'Boolean Invoke(Remabec.PM.Tarification.DocumentEntry)'メソッドを認識せず、このメソッドをストア式に変換することはできません。 –
ええ、それは動作しません、それは私が意味するものではありません。自分でコードを実行してみることができますか? – svick