LINQ to Entities不能识别方法'System.Web.Mvc.FileResult'
我想显示多个用户名与他们的形象所以,我有一个像这样的Json动作方法:
public JsonResult GetUsers() { var ret = (from user in db.Users orderby user.UserName select new { UserName = user.UserName, Pic = GetFileData(user.Id), }).AsEnumerable(); return Json(ret, JsonRequestBehavior.AllowGet); }
这是我的GetFileData
方法来获取用户的图像:
public FileResult GetFileData(int Id) { var avatarImage = db.Files.SingleOrDefault(s => s.ApplicationUserId == Id); return File(avatarImage.Content, avatarImage.ContentType); }
这里, ApplicationUserId
是与File和ApplicationUser
类有关的外键。
现在,当我运行查询,我应该得到用户名与他们的照片但是我得到System.NotSupportedException
。完整的错误信息是:
LINQ to Entities不能识别方法“System.Web.Mvc.FileResult GetFileData(Int32)”的方法,并且此方法不能被转换成存储expression式。
如何得到它的解决。我已经看到了很多与它有关的stackoverflow问题,但没有一个问题是关于FileResult。查看页面的代码在这里http://pastebin.com/AyrpGgEm
无法将GetFileData
转换为T-SQL,Linq to Entities无法识别它。 您可以如下修改代码(将expression式移出GetFileData
):
var pic = GetFileData(user.Id); public JsonResult GetUsers() { var ret = (from user in db.Users orderby user.UserName select new { UserName = user.UserName, Pic = pic, }).AsEnumerable(); return Json(ret, JsonRequestBehavior.AllowGet); }
但是因为用户不在查询之外,所以你应该使用.ToList()
来推迟你的函数的使用。 使用.ToList()
加载数据后,将使用Linq to Objects对已存在于内存中的数据执行任何其他操作(如select
)。 所以你的查询应该是这样的:
public JsonResult GetUsers() { var ret = (from user in db.Users.ToList() orderby user.UserName select new { UserName = user.UserName, Pic = GetFileData(user.Id), }).AsEnumerable(); return Json(ret, JsonRequestBehavior.AllowGet); }