Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用subselect优化linq to sql查询以获得最新结果_C#_Linq To Sql - Fatal编程技术网

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

C# 使用subselect优化linq to sql查询以获得最新结果,c#,linq-to-sql,C#,Linq To Sql,我正在将测验的结果存储在一个表中,我需要为一个用户找出特定测验的所有问题的最新答案id。每行都有id、quizid、questionid、answerid、用户名和datecompleted 我已经成功了,但它太丑陋了,我想我应该寻求帮助来优化它。我将提前开始我的新年决心,编写质量更好的代码!:因此,如果有人想告诉我如何优化它,我将不胜感激 public List<QuestionResult> GetLatestResult(Guid QuizID, string UserName

我正在将测验的结果存储在一个表中,我需要为一个用户找出特定测验的所有问题的最新答案id。每行都有id、quizid、questionid、answerid、用户名和datecompleted

我已经成功了,但它太丑陋了,我想我应该寻求帮助来优化它。我将提前开始我的新年决心,编写质量更好的代码!:因此,如果有人想告诉我如何优化它,我将不胜感激

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到sql,如果您需要更多详细信息,请告诉我

谢谢


安妮莉

以下是我如何攻击这一点的。第一个查询将给出用户最近参加测验的时间。第二个查询将获得该测验的结果,并选择到IEnumerable中。这些查询只是为了可读性而被拆分的,它们可以与第一个查询组合在一起,第一个查询是第二个查询的子选择

public List<QuestionResult> GetLatestResult(Guid QuizID, string UserName)     
{         
    // get the latest date that this user took this quiz
    var latestQuizDate = (from q in db.QuizResults 
                          where q.QuizId == QuizID
                              && q.UserName == UserName
                          select q).Max(q => q.CompletionDate);

    // get the quiz results for this user/quiz/date 
    var results = from q in db.QuizResults
                  where q.CompletionDate = latestQuizDate
                      && q.QuizId == QuizID
                      && q.UserName == UserName
                  select new QuestionResult {q.QuestionId, q.AnswerId};

    return results.ToList();
} 
var QuestionID分配可能会被删除-您已经在第二个分配中筛选了QuizID和用户名

可以使用组重写第二个查询,使整个函数成为一个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变量会被使用两次-在q.QuestionId的行组q之后,第一个q超出范围,这个名称可能会再次使用。

谢谢您的回答!虽然我很喜欢Mykola答案中的分组,所以这次选择了这个。谢谢,这真的很好而且简洁!必须投下它才能发挥作用,否则效果会很好。