我将测验的结果存储在一个表中,我需要找出用户特定测验的所有问题的最新答案 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
分配可能会被删除 - 您已经在第二个中过滤了 QuizID
和 UserName
。
可以使用组重写第二个查询,以便整个函数成为一个 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/