考虑这样的(简化的)表结构:
[USERS]
[APPOINTMENTS]
每个用户都可以拥有0 .. *约会,每个约会可以是许多APPTYPEID之一,并且可以是完整的也可以是不完整的。
我想过滤IQueryable [USER]查询的结果集,使其仅包含具有某个typeID(例如1)的appt的USERS,并且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-many关系来做这件事,这让我全都陷入困境,试图将实体sql概念化。谁能解释一下如何做到这一点?
答案 0 :(得分:2)
qry = ctx.USER.Where(u => u.APPOINTMENTS
.Where(a => a.APPTYPEID == 1)
.Any(a => vals.Contains(a.COMPLETE)));
UPDATE (添加了返回那些根本没有约会的用户)
qry = ctx.USER.Where(u =>
!u.APPOINTMENTS.Any() ||
u.APPOINTMENTS.Any(a => a.APPTYPEID == 1 && vals.Contains(a.COMPLETE)));