Я пытаюсь преобразовать часть 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();
Я надеюсь, что кто-то потрудится прочитать все это и дать свой вклад.
Отказ от ответственности: я не придумал эту концепцию.