如何使用LINQ在数据库中的调查中找到带有答案的问题数量

时间:2018-11-27 01:53:10

标签: c# linq

我有一个调查应用程序,该应用程序从连接到SQL Server数据库的应用程序服务中检索问题和答案。调查分为几页,每页分为几部分。用户提交页面后,我想将各个部分标记为已完成,以使用户无法重新提交其答案。

我正在尝试编写LINQ查询,以将问题的数量与每个部分中的带答案的问题的数量进行比较,以查看是否应将调查部分标记为已完成。请注意,有些问题可能有多个答案,因此我在选择答案时使用.Distinct(),而不仅仅是选择答案的数量。

这是用于选择问题数量的LINQ查询,这个问题总是正确的;它只是在一个部分中返回问题的ID。

var questionsInSection = await _questionRepository.GetAll()
    .Where(q => q.SurveySectionId == surveySectionId)
    .Select(dto => new { dto.Id }).ToListAsync();

这是我试图在一个部分中获得带答案的问题数量的方法。

首先,我需要获取存储库中与令牌关联的所有答案。令牌唯一标识该调查对象。

问题通过QuestionOptions表链接到答案,因此我也将其包括在内。它有一个QuestionId和一个OptionChoicesId组成答案。

我使用问题列表执行内部联接,因此选择将仅获得两个表中都存在的ID。尽管如此,下面的LINQ查询仍返回存储库中所有答案的ID,而不仅仅是返回仅一部分中存在的答案的ID。

var answersInSection = await (from a in _answerRepository.GetAll()
    .Include(t => t.Token).Include(qo => qo.QuestionOptions)
    .Where(a => a.Token.tokenText == input.Token)
    join q in questionsInSection 
      on a.QuestionOptions.QuestionId equals q.Id into QandA
    select new
    {
        Id = QandA.Distinct()
    }).ToListAsync();

如何从LINQ查询中获取带有答案的问题数量的ID?这是相关的数据库架构。

QuestionOptions table                Questions table             Answer table
==================================   =========================== =============
id | QuestionId | OptionsChoicesId   id | Text | SurveySectionId id | QuestionOptionsId | tokenId

此SQL达到正确的结果:

SELECT DISTINCT [Answer].[Id]
  FROM [Portal].[dbo].[Answer]
  INNER JOIN [Portal].[dbo].[QuestionOptions]
    ON [Portal].[dbo].[QuestionOptions].[Id] = [Portal].[dbo].[Answer].[QuestionOptionsId]
  INNER JOIN [Portal].[dbo].[Question]
    ON [Portal].[dbo].[Question].[Id] = [Portal].[dbo].[QuestionOptions].[QuestionId]
  WHERE [Portal].[dbo].[Question].[SurveySectionId] = 2

1 个答案:

答案 0 :(得分:0)

我弄清楚了问题所在。使用into将操作从SQL中的JOIN更改为GroupJoin。我想要定期加入,因此一切都变得平坦了。这是正确的Linq语句。

var questionsInSection = await _questionRepository.GetAll()
                           .Where(q => q.SurveySectionId == surveySectionId).ToListAsync();

var answersInSection = await (from a in _answerRepository.GetAll()
                           .Include(t => t.Token).Include(qo => qo.QuestionOptions)
                           .Where(a => a.Token.tokenText == input.Token)
                           join q in questionsInSection on a.QuestionOptions.QuestionId equals q.Id
                           select new
                           {
                               a.Id
                           }).Distinct().ToListAsync();