Помогите преобразовать SQL-запрос в LINQ - PullRequest
3 голосов
/ 23 февраля 2010

Я пытаюсь преобразовать часть 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();

Я надеюсь, что кто-то потрудится прочитать все это и дать свой вклад.

Отказ от ответственности: я не придумал эту концепцию.

1 Ответ

1 голос
/ 23 февраля 2010

Я не совсем понимаю логику, но мой совет не пытаться получить все ответы в одном магическом запросе.

Через месяц после того, как он был закодирован, вы забудете, как он работает, и потратите больше времени, если вам придется внести небольшие изменения.

Сначала приведите список разумного количества записей для работы из БД, а затем в последующих запросах того же списка уточните и завершите результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...