2013-02-15 52 views
3

考虑的(简化的)表结构是这样的:LINQ到实体 '包含' 条款1一对多关系

[USERS]

  • EMPID
  • NAME

[APPOINTMENTS]

  • (FK_APPT_USER)EMPID
  • APPTTYPEID
  • COMPLETE

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

我想过滤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 

这是很容易做到,如果我比较反对列表中的值与用户对象选择1-1的关系,例如:

var qry = ctx.USER.Where(x=> vals.Contains(x.NAME)); 

但我不了解如何通过与我的约会表一样的一对多关系来完成此任务,它让我全神贯注地试图为其实体sql进行概念化。任何人都可以解释如何做到这一点?

回答

2
​​

UPDATE(添加返回的用户来说,这完全不具有预约)

qry = ctx.USER.Where(u => 
     !u.APPOINTMENTS.Any() || 
     u.APPOINTMENTS.Any(a => a.APPTYPEID == 1 && vals.Contains(a.COMPLETE))); 
+0

您可以组合'。凡()'和'。任何()'电话:' .Any(a => a.APPTYPEID == 1 && vals.Contains(a.COMPLETE))' – Bobson 2013-02-15 20:07:49

+0

@Bobson同意,这可以结合:)我会留下尼古拉斯的味道。另外,我会检查在两种情况下产生的SQL查询 – 2013-02-15 20:13:28

+0

感谢您的快速响应!此解决方案部分运行良好 - 如果USER具有完成的类型1的约会,它将返回这些用户。但是,如果用户没有任何类型1的约会,或者根本没有任何约会,如果列表只包含“N”(这是有道理的),那么它不会返回这些约会。我想我可能需要将它分解为IF/ELSE来捕捉这种行为,现在我想到了它。 – NMR 2013-02-15 20:15:17