次のような (簡略化された) テーブル構造を考えてみましょう。
[ユーザー]
- エンピッド
- 名前
【予定】
- (FK_APPT_USER) EMPID
- APPTTYPEID
- 完了
各ユーザーは 0..* の予定を持つことができ、それぞれが多数の APPTYPEID の 1 つであり、完了または未完了のいずれかになります。
IQueryable[USER] クエリの結果セットをフィルター処理して、typeID (1 など) の appt を持ち、COMPLETE フィールドが値のリストにあるユーザーのみが含まれるようにします。これは、ユーザーが特定の予定の種類に対して完了したユーザーのみを表示するか、完了していないユーザーのみを表示するかを選択できるようにする gridview フィルターの一部として実行しています。
List<string> vals = new List<string> {"Y","N"}
//maybe the user has only selected Y so the above list only contains 1 element
var qry = ctx.USER.Where(x=> vals.Contains( ? ));
//bind etc
リストと比較している値が USER オブジェクトと 1 対 1 の関係にある場合、これは非常に簡単です。次に例を示します。
var qry = ctx.USER.Where(x=> vals.Contains(x.NAME));
しかし、予定テーブルのような1対多の関係でそれを行う方法がわかりません。エンティティSQLを概念化しようとすると、頭がいっぱいになります。誰でもこれを行う方法を説明できますか?