0

我在设计一个查询来检索候选人已经尝试过的问题以及另一个查询候选人没有尝试过的问题时遇到了太多麻烦。这是一个考试/测试/表格/调查类型的应用程序。

架构

该场景是一个候选(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;
4

2 回答 2

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...

于 2013-03-15T20:57:18.930 回答
0

Linq 查询语法与 SQL 非常相似。您应该能够使用“加入”运算符来做您需要的事情。

这是一个很好的概述:

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

于 2013-03-15T18:20:03.950 回答