2013-03-15 38 views
0

我一直在設計一個查詢來檢索候選人已經嘗試的問題以及針對候選人未嘗試的問題的另一個查詢時遇到了太多麻煩。這適用於考試/考試/表格/調查類型的申請。Linq到具有多級子引用的實體查詢

Schema

的情況是候選人(OAS_UserDetail)與多組(OAS_Group)相關聯。 一組可以有很多測試。 一個測試可以有很多問題。 一個問題可以有很多選項。

當候選人嘗試提問時,它存儲在引用會話的表TestResponse中(表TestResponse中的answerSelected實際上是QuestionOption.Id)。我相信TestSession可以作爲TestResponse的橋樑,以獲取用戶,測試和組的詳細信息。

這對我來說似乎是一個很好的但有點複雜的設計,只要通過Linq來查詢。 下面是我試圖做的事情,並被卡住,並最終在方法語法而不是查詢語法中編寫Linq。

OAS.DataModels.OAS_Question questionsAttempted = 
      from q in db.OAS_Questions 
      where q.OAS_Test.OAS_Group.Candidates.Contains(
         db.OAS_UserDetails.Single(u => u.UserName == HttpContext.User.Identity.Name) 
      )       
      select q; 

回答

0

所以,你正在尋找一個候選者的選擇要麼是或不是候選人的TestResponse記錄的問題。我想這可能是工作:

(from u in OAS_UserDetail 
from g in u.OAS_Group 
from t in g.OAS_Test 
from q in t.OAS_Question 
from o in q.OAS_QuestionOption 
where u.Id == userId // a variable 
where u.OAS_TestSession 
     .SelectMany(s => s.OAS_TestResponse) 
     .Select(r => r.AnswerSelectedId).Contains(o.Id) 
select q).Distinct() 

和問題,候選人沒有嘗試:where !u.OAS_TestSession...