2
我試圖做到這一點(從數據庫加載一些數據通過JSON將其發送) 但我逮住一個錯誤時拋出:LINQ到實體無法識別方法「GetUserById」
附加信息:LINQ到實體無法識別方法 「Model.Models.User GetUserById(Int32)已」的方法,而這種方法不能 被翻譯成店表達
如何避免此異常,並獲得userId
我需要爲每個記錄
我試圖做到這一點(從數據庫加載一些數據通過JSON將其發送) 但我逮住一個錯誤時拋出:LINQ到實體無法識別方法「GetUserById」
附加信息:LINQ到實體無法識別方法 「Model.Models.User GetUserById(Int32)已」的方法,而這種方法不能 被翻譯成店表達
如何避免此異常,並獲得userId
我需要爲每個記錄
實體框架試圖將您的查詢轉換爲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);
我相信我不需要雙LINQ選擇 –
反正дзякуй,先生 –
葉氏,需要那邊那個過濾器。我只爲一個用戶加載這些消息,他們曾在當前房間中添加過最喜歡的消息 –