C# Linq到实体';包含';第1条-多人关系

C# Linq到实体';包含';第1条-多人关系,c#,asp.net,entity-framework,linq-to-entities,entity-sql,C#,Asp.net,Entity Framework,Linq To Entities,Entity Sql,考虑这样一个(简化的)表结构: [用户] 埃皮德 名字 [委任] (FK_应用程序用户)EMPID 应用类型ID 完整的 每个用户可以有0个..*约会,每个约会可以是多个APPTYPEID中的一个,可以是完整的,也可以是不完整的 我想过滤IQueryable[USER]查询的结果集,这样它只包括具有某种类型ID(比如1)的appt并且完整字段位于值列表中的用户。我这样做是作为gridview过滤器的一部分,该过滤器允许用户选择仅显示特定约会类型的已完成用户或未完成用户 List<s

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

[用户]

  • 埃皮德
  • 名字
[委任]

  • (FK_应用程序用户)EMPID
  • 应用类型ID
  • 完整的
每个用户可以有0个..*约会,每个约会可以是多个APPTYPEID中的一个,可以是完整的,也可以是不完整的

我想过滤IQueryable[USER]查询的结果集,这样它只包括具有某种类型ID(比如1)的appt并且完整字段位于值列表中的用户。我这样做是作为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
但我不明白如何处理1-many关系,比如我的约会表,这让我绞尽脑汁,试图为它概念化实体sql。有人能解释一下怎么做吗

qry = ctx.USER.Where(u => u.APPOINTMENTS
                           .Where(a => a.APPTYPEID == 1)
                           .Any(a => vals.Contains(a.COMPLETE)));
更新(添加并返回那些根本没有约会的用户)


您可以将
.Where()
.Any()
调用组合为:
.Any(a=>a.APPTYPEID==1&&vals.Contains(a.COMPLETE))
@Bobson同意,可以组合为:)我让尼古拉斯尝尝。此外,我还将检查在这两种情况下生成的SQL查询,以便快速响应!此解决方案部分工作正常-如果用户的约会类型为1且已完成,则会返回这些用户。但是,如果用户没有任何类型1的约会,或者根本没有,那么如果列表中只包含“N”(这很有意义),则不会返回这些约会。“现在我想,我可能需要将其拆分为IF/ELSE来捕捉这种行为。@NicholasRobert嗯,当你询问应用程序类型和包含时,我误解了你的问题。等一下,我来修改答案
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)));