編集: LinqPadの助けを借りて、コードを最小公倍数に減らすことができました。
複雑な LinqKit 述語を返すメソッドがあります。望ましい結果は、このクエリを実行する必要があるときはいつでもこのメソッドを再利用できることです。Where
これらのエンティティのコレクションに対する句では正常に機能IQueryable
しますが、このエンティティをオブジェクトの単一のプロパティとして使用し、述語を使用してクエリを実行したい場合、この述語を使用する方法を一生理解できませんそのエンティティの他のプロパティ。
私が言いたいことの簡単な例を挙げます。
// Note: .Includes removed for brevity's sake.
var task = Tasks.First(t => t.QaConfigTaskId == 2);
var predicate = PredicateBuilder.True<Task>();
// Ensure that the task's own properties match.
predicate = predicate.And(t => t.TaskType == task.TaskType &&
t.Description == task.Description &&
t.PreTreatment == task.PreTreatment &&
t.Treatment == task.Treatment);
var structureAnalysis = task.StructureAnalysis;
var query = PredicateBuilder.True<StructureAnalysis>();
query = query.And(analysis =>
// The names match
analysis.Name == structureAnalysis.Name &&
// We have the same # of goals so they must all match.
analysis.Goals.Count == structureAnalysis.Goals.Count
);
predicate = predicate.And(t => query.Invoke(t.StructureAnalysis));
これはうまくいきます:
StructureAnalyses.AsExpandable().Where(query).Dump();
... Entity Framework からの私のオブジェクトの 1 つでStructureAnalyses
あると仮定します。IQueryable
StructureAnalysis
しかし、関連する StructureAnalyses でフィルタリングして、タスクを取得したいとしましょう。どうすればそのようなことができますか?実際にquery
は、再利用可能な関数によって構築され、predicate
それを呼び出す別の関数で構築されていることに注意してください。そのため、2 つのクエリを単純にマージすることはできません。
コンパイルはできますが、クエリを実行しようとすると失敗します。
Tasks.AsExpandable().Where(predicate).Dump();
...with "パラメーター 't' は、指定された LINQ to Entities クエリ式にバインドされていません。" など。この例では、DB 内のすべての型エンティティTasks
を含む IQueryable です。Task
私はまた、この行を変更しようとしました:
predicate = predicate.And(t => query.Invoke(t.StructureAnalysis));
...に:
compiled = query.Compile();
predicate = predicate.And(t => compiled(t.StructureAnalysis));
これもコンパイルされますが、 「タイプ 'System.Linq.Expressions.FieldExpression' のオブジェクトをタイプ 'System.Linq.Expressions.LambdaExpression' にキャストできません」で失敗します。当然のことです。
Expand
また、 との両方query
を呼び出してみましcompiled
たが、効果はありませんでした。また、次の「解決策」も試しました。
- これは不完全なようです(
Utility
未定義です): https://stackoverflow.com/questions/26105570/linqkit-the-parameter-was-not-bound-in-the-specified-linq-to-entities-query-e - これは、私が信じることを拒否する「それはできない」と単純に言っています: Entity Framework Code First 4.3 / LINQKit predicate for related table