ASP.NET MVC3、EF 4.3.1、DynamicQuery ライブラリを使用しています。現在、複数のデータベースに対して検索クエリを実行できる動的検索エンジンを開発しています。
したがって、ユーザーがクエリを作成できるインターフェイスがあります。インターフェイスは次のようになります。
その後、コントローラー内でグループ/句の階層を再作成し、異なるテーブル間でいくつかの結合を実行する必要があります (例: Study / People)。
問題は、結合を実行するときに、次のように実行することです。
if (queries.ContainsKey("Drug"))
{
query = query.Join(GetContext().StudyDrugs, s => s, sd => sd.StudyId, (s, sd) => new { Study = s, StudyDrug = sd })
.Join((IQueryable<int>)queries["Drug"], obj => obj.StudyDrug.DrugId, d => d, (obj, d) => obj.Study);
}
ただし、生成されたクエリの Where 句を設定することはできません。それらは常に検索されたオブジェクトに適用されるとは限らずIQueryable<T>
、結合されたオブジェクトに適用されるためです。
And : 句をグループ化できるようにする必要があるため (スクリーンショットでグループを使用する理由)、括弧を使用して Where 句を正しく生成できる必要があります。(これは PredicateBuilder クラスで実行できるようですが、検索の結果が であるため、where 句がクラスに適用されるか、結合されたクラスの 1 つにIQueryable<T>
適用されるかはわかりません。T
何か不足していますか?結合が完了した後、オブジェクトがデータベースから引き出される前に (まだオブジェクト上にある) where 句を追加できるトリックはありますIQueryable
か?
編集 :
実際、生成された SQL クエリで 'as' 名を指定できれば、where 句の終了は非常に簡単に実行できます。結合されたテーブル (次の例では T2) に名前を付ける方法はありますか?
SELECT * FROM Table1 T1
JOIN Table2 T2 on (T1.T2Key = T2.Key)