3

次のような (簡略化された) テーブル構造を考えてみましょう。

[ユーザー]

  • エンピッド
  • 名前

【予定】

  • (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を概念化しようとすると、頭がいっぱいになります。誰でもこれを行う方法を説明できますか?

4

1 に答える 1

3
qry = ctx.USER.Where(u => u.APPOINTMENTS
                           .Where(a => a.APPTYPEID == 1)
                           .Any(a => vals.Contains(a.COMPLETE)));

更新(予定がまったくないユーザーを返すように追加)

qry = ctx.USER.Where(u => 
        !u.APPOINTMENTS.Any() ||
         u.APPOINTMENTS.Any(a => a.APPTYPEID == 1 && vals.Contains(a.COMPLETE)));
于 2013-02-15T19:51:57.980 に答える