我正在尝试将我已修补的一些SQL转换为LINQ查询。
上下文是一个简单的测验应用程序。一个测验有小问题,参赛者是一对一附加到小圈子,轮次有注册答案。
案例是我在表'quizround'和'answer'之间有一对多的关系。 我想通过计算正确答案的数量和回答所有 - 纠正答案所花费的时间来对所有问题进行排名。
我通过以下SQL查询部分成功地获得了此行为:
select
quizroundid, SUM(CASE WHEN wascorrect = 1 THEN timeelapsedseconds ELSE 0 END) as [time] ,SUM(CONVERT(int,wascorrect)) as correct
from quizroundanswer
GROUP BY quizroundid
order by correct desc, [time] asc
现在我需要能够做到这一点,但作为Linq查询的一部分,我需要能够对已回答相同数量或更多问题的回合进行排名。
所以,让我们说当它有4个答案时完成一轮。第x轮在23日和24日有答案,但第y轮在21日,22日,23日和24日有答案。第x轮将在25日和26日回答问题,但还没有完成。
我想对第x轮进行排名,但是我需要针对那些已经播放相同或更多天数(第y轮)但仅针对相似数量的答案且按相同顺序进行排名。圆形x的含义得出第23和第24的答案,与第21和第22轮的y答案进行比较。
这是我到目前为止的linq,它似乎有效。我真的不喜欢它的外观,希望有更好的方法来实现它。
var rankedRounds = allRounds
.Where(x => x.Answers.Count >= questionsAnswered)
.Select(x => new
{
x.Id,
EqualNumberOfAnswers = x.QuizRoundAnswers.OrderBy(y => y.QuizDay.TimeOfDay).Take(daysPlayed)
})
.OrderBy(x => x.EqualNumberOfAnswers.Where(z => z.WasCorrect).Sum(y => y.TimeElapsedSeconds))
.OrderByDescending(x => x.EqualNumberOfAnswers.Count(y => y.WasCorrect))
.ToList();
我希望有人会费心阅读所有这些并提供意见。
免责声明:我没有提出这个概念。
答案 0 :(得分:1)
我不完全理解逻辑,但我的建议不是试图在一个神奇的查询中得到所有的答案。
编码后一个月,您将忘记它是如何工作的,并且如果您需要进行一些小改动,将花费更多时间。
首先从DB中提供合理数量的记录列表,然后在同一列表的后续查询中,优化并完成结果。