Linq-to-实体"包含"子句 1-多关系



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

[用户]

  • EMPID
  • 名称

【预约】

  • (FK_APPT_USER)EMPID
  • appttypied
  • 完成

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

我想过滤IQueryable[USER]查询的结果集,这样它只包括具有某种类型ID(比如1)的appt并且COMPLETE字段在值列表中的USERS。我这样做是作为网格视图过滤器的一部分,该过滤器允许用户选择只显示特定约会类型的已完成或未完成用户。

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。有人能解释一下如何做到吗?

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)));

最新更新