2017-06-13 74 views
2

我試圖做到這一點(從數據庫加載一些數據通過JSON將其發送) 但我逮住一個錯誤時拋出:LINQ到實體無法識別方法「GetUserById」

附加信息:LINQ到實體無法識別方法 「Model.Models.User GetUserById(Int32)已」的方法,而這種方法不能 被翻譯成店表達

如何避免此異常,並獲得userId我需要爲每個記錄

回答

4

實體框架試圖將您的查詢轉換爲SQL查詢。但它無法將GetUserById方法調用轉換爲SQL(這裏並不令人意外)。你應該LINQ查詢,這部分轉移到客戶端:

var favList = context.FavoriteMessages 
     .Where(m => m.UserId == user.UserId && m.OnlineRoomId == user.OnlineRoomId) 
     .Select(m => new { 
      m.UserId, // return user id from database 
      m.Instance, 
      m.CreatedOn 
     }) 
     .AsEnumerable() // further part of query is not translated into SQL 
     .Select(i => new { 
      UserName = userService.GetUserById(i.UserId).Name, // get name locally 
      i.Instance, 
      i.CreatedOn 
     }).ToList(); 

但是,如果你想了解如何過濾查詢的一部分,你會看到你只選擇具有用戶id等於user.UserId消息。這意味着 - 所有選定的消息都將具有相同的用戶標識,更重要的是 - 這將是您已擁有的用戶標識。甚至更多 - 您已在User.Identity.Name中擁有用戶名。因此,查詢應該是這樣的:

var user = userService.GetUserByName(User.Identity.Name); 
var favorites = from m in context.FavoriteMessages 
       where m.UserId == user.UserId && m.OnlineRoomId == user.OnlineRoomId 
       select new { 
        UserName = user.Name, 
        m.Instance, 
        m.CreatedOn 
       }; 

return Json(favorites.ToList(), JsonRequestBehavior.AllowGet); 
+1

我相信我不需要雙LINQ選擇 –

+1

反正дзякуй,先生 –

+1

葉氏,需要那邊那個過濾器。我只爲一個用戶加載這些消息,他們曾在當前房間中添加過最喜歡的消息 –

相關問題