2012-03-21 19 views
15

Estoy tratando de mostrar una lista desplegable de usuarios en mi vista. Aquí está el código que estoy usando en mi método de control:Crear una colección de SelectListItem con LINQ

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

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

me sale un error tratando de convertir UserID en una cadena:

LINQ a Entidades no reconoce el sistema de método '. El método String ToString() ', y este método no se puede traducir a una expresión de tienda.

¿Cómo creo una colección de SelectListItem de mis entidades?

+0

echar un vistazo a esto: http://stackoverflow.com/questions/5899683/linq-to-entities-does-not-recognize -the-method-system-string-tostring-method –

Respuesta

30

ToString() solo se puede utilizar en Linq to Objects. Una solución simple es insertar .ToList() de la siguiente manera:

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

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

Esto va a volver a todos los usuarios de su tabla de usuario. Si puede reducir la cantidad de usuarios obtenidos de la base de datos, su consulta será más eficiente, p.

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

si no desea recibir todas las columnas, también puede usar: 'var users = (from u en _usersRepository.Users where .... select new {u.FirstName , u.LastName, u.UserID}). ToList(). Select (u => new SelectListItem {Text = u.FirstName + "" + u.LastName, Value = u.UserID.ToString()}); ' –

+0

¿Qué pasa si lo queremos Distinct by 'FirstName'? – Halter

9

creo que estás buscando 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

¿Esto preservará la ejecución diferida de la consulta? Porque si es así (sinceramente, no sé de qué va), esta podría ser una mejor opción si eso es importante. –

+1

Se conserva la ejecución diferida. Los proveedores de LINQ to Entities pueden analizar los métodos de 'SqlFunctions' en su SQL equivalente. Por lo tanto, puede redactar y ejecutar esta consulta de la misma forma que una consulta más típica. – Sorax

+0

¡Es bueno saberlo! Marcando esta pregunta para futura referencia, ¡gracias por la aclaración! –

Cuestiones relacionadas