2015-12-03 2 views
1

Я пытаюсь показать несколько пользователя с их изображением Итак, у меня есть метод JSon действий, как это:LINQ к Entities не распознает метод «System.Web.Mvc.FileResult»

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 является внешним ключом, относящимся к файлам и ApplicationUser класса.

Теперь, когда я выполнить запрос, я должен получить имя пользователя с их ПОС Но я получаю System.NotSupportedException .The полное сообщение об ошибке:

LINQ к Entities не распознает метод «system.web .Mvc.FileResult GetFileData (Int32) ', и этот метод не может быть переведен в выражение хранилища.

Как получить его resolved.I видел много StackOverflow вопроса, касающегося его, но ни один из вопроса не относящийся к FileResult.The коде для просмотра страницы здесь http://pastebin.com/AyrpGgEm

+1

Ну, вы попробовали применить те же * рассуждения * к другим вопросам к вашей ситуации? В принципе, вам почти наверняка просто нужно 'AsEnumerable()' * перед * select, например. 'db.Users.OrderBy (user => user.UserName) .AsEnumerable(). Выберите (user => new {user.UserName, Pic = GetFileData (user.Id)})' –

+0

Вы, по крайней мере, внесите материализацию своего запроса перед 'select' (например,' .ToList() ') –

+1

Я никогда не пытался сериализовать' FileResult' для Json, но я не удивлен, потому что это не сработает. Я подозреваю, что вам нужно отправить изображения в формате Base64. –

ответ

2

GetFileData не может быть переведен на Т -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 для объектов по уже находящимся в памяти данным. Таким образом, ваш запрос должен быть таким:

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