Linq to实体查询具有多级子引用

时间:2013-03-15 17:59:28

标签: c# .net linq linq-to-entities entity-framework-5

我一直在设计查询以检索候选人已经尝试过的问题以及对候选人未尝试过的问题进行另一次查询时遇到了太多麻烦。这适用于考试/考试/表格/调查类型的申请。

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;

2 个答案:

答案 0 :(得分:0)

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

以下是一个很好的概述:

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

答案 1 :(得分: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...