c# - 使用 subselect 优化 linq to sql 查询以获得最新结果

标签 c# linq-to-sql

我将测验的结果存储在一个表中,我需要找出用户特定测验的所有问题的最新答案 ID(每一行都有 id、quizid、questionid、answerid、用户名和完成日期).

我已经让它工作了,但它太丑了,我想我应该寻求帮助来优化它。我提早开始我的新年计划,写出更优质的代码! :) 因此,如果有人想告诉我如何优化它,将不胜感激!

public List<QuestionResult> GetLatestResult(Guid QuizID, string UserName)
    {
        List<QuestionResult> quizResult = new List<QuestionResult>();

        // first get all question ids for that quiz
        var questionIDs = (from q in db.QuizResults
                          where (q.QuizId == QuizID && q.UserName == UserName)
                          select q.QuestionId).Distinct();

        // then get the most recent answer id for those questions
        var results = from r in questionIDs
                      select (from q in db.QuizResults
                              where q.QuizId == QuizID
                              && q.UserName == UserName
                              && q.QuestionId == r
                              orderby q.DateCompleted descending
                              select q).Take(1);

        foreach (var item in results)
        {
            foreach (var qr in item)
            {
                QuestionResult result = new QuestionResult();
                result.QuestionId = qr.QuestionId;
                result.AnswerId = qr.AnswerId;
                quizResult.Add(result);
            }
        }

        return quizResult;
    }

它是 C#,linq to sql,如果您需要更多详细信息,请告诉我。

谢谢,

安妮

最佳答案

var questionIDs 分配可能会被删除 - 您已经在第二个中过滤了 QuizIDUserName

可以使用组重写第二个查询,以便整个函数成为一个 LINQ:

public List<QuestionResult> GetLatestResult(Guid QuizID, string UserName) {
    return (
           from q in db.QuizResults
           where q.QuizId == QuizID && q.UserName == UserName
           group q by q.QuestionId into grouped
           select new QuestionResult {
               QuestionId = grouped.Key,
               AnswerId = grouped.OrderByDescending(q => q.CompletionDate).First().AnswerId
           };
       ).ToList();
}

编辑

不要担心 q 变量被使用了两次 - 在 group q by q.QuestionId first q 行之后-scope,这个名字可能会被再次使用。

关于c# - 使用 subselect 优化 linq to sql 查询以获得最新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555126/

相关文章:

c# - C# 如何为类生成 GUID?

c# - 将 WriteableBitmap 转换为字节数组 - Windows phone 8.1 - Silverlight

c# - 获取类型的默认构造函数的最有效方法

c# - Orchard IRepository 与 Linq to SQL

c# - asp.net mvc中基于两个参数使用Linq-To-Sql进行分页

c# - LINQ-to-SQL 中的记录级安全性

c# - 如何制作包含主要项目的列表

c# - 当 session 过期时, session 管理器不会将我注销,HTTPContext.Current 为 Null

c# - 类型 'System.String[]' 不支持比较运算符

c# - 当我执行 ToList() 时,为什么这个 LINQ to SQL 查询会中断?