我试图将一些已修补到一起的SQL转换为LINQ查询。帮助将SQL查询转换为LINQ
上下文是一个简单的测验应用程序。一个测验有quizrounds,参赛者是一对一附加到quizrounds,轮已登记答案。
这种情况是我在表格'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个答案时完成。 Round x在23日和24日有答案,但是在21日,22日,23日和24日有回答。 Round x将在25日和26日回答问题,但尚未完成。
我想对第x轮进行排名,但是我需要针对那些已经玩了相同或更多天数(第y轮)但仅针对类似数量的答案并以相同顺序的游戏进行排名。第x轮的含义与第21轮和第22轮的y轮回答相比,第23轮和第24轮的回答相同。
这是我到目前为止的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();
我希望有人会麻烦阅读所有这些,并给予意见。
声明:我没有想出这个概念。