2012-03-21 3 views
15

Я пытаюсь отобразить выпадающий список пользователей в моем представлении. Вот код, я использую в моем методе контроллера:Создание коллекции SelectListItem с LINQ

var users = _usersRepository.Users.Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            } 

return View(new MyViewModel { Users = users }); 

Я получаю сообщение об ошибке, пытаясь преобразовать UserID в строку:

LINQ к Entities не распознает «System метод. String ToString() ', и этот метод не может быть переведен в выражение хранилища.

Как создать коллекцию SelectListItem от моих сущностей?

+0

посмотрите на это: http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method –

ответ

30

ToString() может использоваться только в Linq для объектов. Простое решение для вставки .ToList() следующим образом:

var users = _usersRepository.Users.ToList().Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            }); 

return View(new MyViewModel { Users = users }); 

Это собирается вернуть всех пользователей из таблицы пользователей. Если вы можете уменьшить количество пользователей, полученных из базы данных, ваш запрос будет более эффективным, например.

var users = _usersRepository.Users.Where(u => ....).ToList().Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = u.UserID.ToString() 
            }); 

return View(new MyViewModel { Users = users }); 
+1

, если вы не хотите получать все столбцы, которые вы также можете использовать: 'var users = (от u в _usersRepository.Users где .... select new {u.FirstName , u.LastName, u.UserID}). ToList(). Выберите (u => новый SelectListItem {Text = u.FirstName + "" + u.LastName, Value = u.UserID.ToString()}); ' –

+0

Что, если мы хотим, чтобы это отличалось от имени 'FirstName'? – Halter

9

Я думаю, что вы ищете SqlFunctions

using System.Data.Objects.SqlClient; 

var users = _usersRepository.Users.Select(u => new SelectListItem 
            { 
             Text = u.FirstName + " " + u.LastName, 
             Value = SqlFunctions.StringConvert((double?)u.UserID) 
            } 

return View(new MyViewModel { Users = users }); 
+0

Будет ли это сохранение отсроченного выполнения запроса? Потому что, если это так (я, честно говоря, не знаю с головы), это может быть лучшим вариантом, если это важно. –

+1

Отложенное исполнение сохраняется. Поставщики LINQ to Entities могут анализировать методы 'SqlFunctions' в эквивалентный SQL. Таким образом, вы можете составить и выполнить этот запрос так же, как более типичный запрос. – Sorax

+0

Полезно знать! Закладка этого вопроса для дальнейшего использования, спасибо за разъяснение! –

Смежные вопросы