问题描述
概述:在 CompletedQuestions 表中,UserId 对应于完成该问题的用户.Id 属性对应于 Questions 表中的问题之一.我知道,我没有正确指定关系.但我不是很有经验.我只想完成一个项目,然后我会在了解更多信息后回来修复那些糟糕的编码实践.我无法理解以下异常.
Overview:In CompletedQuestions table, UserId corresponds to the user which completed that question. Id property corresponds to one of the questions in the Questions table. I know, i didn't specify relationships properly. But i'm not very experienced. I just want to finish a project, then i will come back and fix those bad coding practices once i learn more. I couldn't understand the following exception.
LINQ to Entities does not recognize the method 'Riddle.Models.CompletedQuestion LastOrDefault[CompletedQuestion](System.Linq.IQueryable`1[Riddle.Models.CompletedQuestion])' method, and this method cannot be translated into a store expression.
Line 46: if (RiddleCompleted == null)
Line 47: {
Line 48: var lastCompletedQuestion = _db.CompletedQuestions.Where(q => q.UserId == currentUserId) // exception occurs in this line
Line 49: .OrderBy(q => q.QuestionNumber)
Line 50: .LastOrDefault();
发生异常的动作:
public ActionResult Riddle(int Id)
{
string currentUserId = User.Identity.GetUserId();
var riddle = _db.Riddles.Where(r => r.Id == Id).Single();
if (riddle.User.Id == User.Identity.GetUserId())
{
var question = riddle.Questions.Where(q => q.QuestionNumber == 1).SingleOrDefault();
if (question == null)
{
return View("NoMoreQuestions");
}
return View("RiddleOwner", question);
}
else
{
var RiddleCompleted = _db.CompletedRiddles.Where(r => r.Id == Id && r.UserId == currentUserId).SingleOrDefault();
if (RiddleCompleted == null)
{
var lastCompletedQuestion = _db.CompletedQuestions.Where(q => q.UserId == currentUserId) // exception occurs in this line
.OrderBy(q => q.QuestionNumber)
.LastOrDefault();
if (lastCompletedQuestion == null)
{
var question = riddle.Questions.Where(q => q.QuestionNumber == 1).Single();
return View(question);
}
else
{
var question = riddle.Questions.Where(q => q.QuestionNumber == lastCompletedQuestion.QuestionNumber + 1).SingleOrDefault();
return View(question);
}
}
else
{
return View("NoMoreQuestions");
}
}
}
已完成的问题模型:
public class CompletedQuestion
{
public int Id { get; set; }
public string UserId { get; set; }
public int QuestionNumber { get; set; }
}
问题模型:
public class Question
{
public int Id { get; set; }
public string Body { get; set; }
public string Answer { get; set; }
public Riddle Riddle { get; set; }
[Column(TypeName ="datetime2")]
public DateTime CreationDate { get; set; }
public int QuestionNumber { get; set; }
}
推荐答案
LastOrDefault() 不受 Linq To Entities 支持.因此,它可以在内存中的集合上工作,但在您尝试查询数据库时则不行.
LastOrDefault() isn't supported by Linq To Entities. So it will work on a collection in memory, but not when you're attempting to query a database .
这是一种有效的处理方式:
This is an efficient way to handle it:
var lastCompletedQuestion =
_db.CompletedQuestions.Where(q => q.UserId == currentUserId)
.OrderByDescending(q => q.QuestionNumber)
.FirstOrDefault()
;
这篇关于LINQ to Entities 无法识别该方法:LastOrDefault的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!