【问题标题】:LINQ to Entities does not recognize the method 'System.Web.Mvc.FileResult'LINQ to Entities 无法识别方法“System.Web.Mvc.FileResult”
【发布时间】:2015-12-03 09:00:12
【问题描述】:

我正在尝试使用他们的图像显示多个用户名所以,我有一个这样的 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)' 方法,和这个方法 无法翻译成商店表达式。

如何解决它。我已经看到很多与之相关的 stackoverflow 问题,但没有一个问题与 FileResult 相关。查看页面的代码在这里http://pastebin.com/AyrpGgEm

【问题讨论】:

  • 那么您是否尝试过对其他问题应用相同的推理来解决您的情况?基本上,您几乎可以肯定只需要AsEnumerable() before 选择,例如db.Users.OrderBy(user => user.UserName).AsEnumerable().Select(user => new { user.UserName, Pic = GetFileData(user.Id) })
  • 您至少要在select 之前实现您的查询(例如.ToList()
  • 我从未尝试将FileResult 序列化为 Json,但我并不感到惊讶不会工作。我怀疑您需要以 Base64 格式发送图像
  • @duke:鉴于它们与问题相关,它们应该问题中。
  • 但无论如何我们已经解决了问题中的问题 - 我们不知道新异常的堆栈跟踪是什么样的。您应该就该问题提出一个新问题。

标签: c# json asp.net-mvc entity-framework linq


【解决方案1】:

GetFileData 无法转换为 T-SQL,Linq to Entities 无法识别。您可以修改代码如下(将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(),任何进一步的操作(例如select)都使用Linq to Objects对内存中的数据执行。所以你的查询应该是这样的:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2012-04-03
    • 2021-11-06
    • 2012-05-03
    相关资源
    最近更新 更多