2010-02-23 136 views
3

我试图将一些已修补到一起的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(); 

我希望有人会麻烦阅读所有这些,并给予意见。

声明:我没有想出这个概念。

回答

1

我不完全理解逻辑,但我的建议是不要尝试在一个魔法查询中获得所有答案。

它被编码一个月后,你会忘记它是如何工作的,如果你必须做一些小的改变,它会花更多的时间。

首先从数据库中提取合理数量的记录工作,然后在同一列表的后续查询中细化并完成结果。