2016-09-25 76 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。

相关问题