2016-09-25 13 views
0

概要: 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; } 
    } 

答えて

2

LastOrDefault()は、Linq To Entitiesではサポートされていません。したがって、メモリ内のコレクションでは機能しますが、データベースにクエリを実行しようとしているときには機能しません。

これは、それを処理するための効率的な方法です:

var lastCompletedQuestion = 
_db.CompletedQuestions.Where(q => q.UserId == currentUserId) 
.OrderByDescending(q => q.QuestionNumber) 
.FirstOrDefault() 

                     ; 
2

エンティティフレームワーク/ linq2sql作品よurはC#/ ILをSQLにコンパイルしました。それは、それが知っているメソッドだけを変換することができます。エラーは、LastOrDefaultがそれらの1つではないことを伝えています。

これは、LastOrDefaultの前に.ToList()を置くことで修正できます。これは、sql-converterからバニラC#に移動し、LastOrDefaultの正規のバージョンを取得します。または、注文を裏返し、FirstOrDefaultを使用して翻訳することができます。

関連する問題