【发布时间】:2010-02-23 09:23:18
【问题描述】:
我正在尝试将一些已修补的 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 轮的答案,而第 y 轮有第 21 和第 22 轮的答案。
这是我到目前为止的 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();
我希望有人会费心阅读所有这些并提供意见。
免责声明:我没有提出这个概念。
【问题讨论】:
标签: c# sql sql-server linq linq-to-sql