概要: CompletedQuestionsテーブルでは、UserIdがその質問を完了したユーザーに対応しています。 Idプロパティは、質問テーブルの質問の1つに対応します。私は、関係を適切に指定しなかったことを知っています。しかし、私は経験はあまりありません。私はちょうど私がより多くを学ぶと、私は戻って、それらの悪いコーディング慣行を修正する、プロジェクトを終了したい。私は次の例外を理解できませんでした。LINQ to Entitiesはメソッドを認識しません
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");
}
}
}
CompletedQuestionモデル:
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; }
}