2016-09-25 91 views
0

概述: 在CompletedQuestions表中,UserId對應於完成該問題的用戶。 Id屬性對應於「問題」表中的其中一個問題。我知道,我沒有正確指定關係。但我不是很有經驗。我只想完成一個項目,然後我會回來修復那些不好的編碼實踐,一旦我瞭解更多。我無法理解以下例外情況。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

Linq To Entities不支持LastOrDefault()。所以它會在內存中處理一個集合,但不是當你試圖查詢數據庫時。

這是處理它的有效途徑:

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

                     ; 
2

實體框架/ LINQ2SQL作品轉換喲我們將C#/ IL編譯爲SQL。它只能轉換它知道的方法。該錯誤告訴你,LastOrDefault不是其中之一。

您可以通過在LastOrDefault之前放置.ToList()來解決此問題,該方法將它從sql轉換器轉換爲vanilla C#並獲得常規工作版本的LastOrDefault。或者您可以翻轉訂單並使用它可以翻譯的FirstOrDefault。

相關問題