【问题标题】:Linq to entities query having multi level child referencesLinq to 实体查询具有多级子引用
【发布时间】:2013-03-15 17:59:27
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    这是一个很好的概述:

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

    【讨论】:

      【解决方案2】:

      因此,您正在寻找候选人的问题,其中选项在候选人的TestResponse 记录中或不在候选人的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...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        相关资源
        最近更新 更多