3

考虑一个像这样的(简化的)表结构:

[用户]

  • EMPID
  • 姓名

[任命]

  • (FK_APPT_USER) EMPID
  • APPTYPEID
  • 完全的

每个用户可以有 0..* 个约会,每个约会可以是多个 APPTYPEID 之一,可以是完整的也可以是不完整的。

我想过滤 IQueryable[USER] 查询的结果集,使其仅包括拥有某个 typeID 的 appt(比如 1)且 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 回答