2013-03-15 41 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...