我有一个调查应用程序,该应用程序从连接到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
答案 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();