2013-02-15 53 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