【问题标题】:Help converting an sql query into LINQ帮助将 sql 查询转换为 LINQ
【发布时间】: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


    【解决方案1】:

    我并不完全理解其中的逻辑,但我的建议是不要试图在一个神奇的查询中获得所有答案。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2011-03-25
      • 2018-11-24
      • 2014-06-07
      相关资源
      最近更新 更多