var items = from c in contacts
select new ListItem
{
Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
Text = c.Name
};
¿Hay alguna forma de lograr esto? Tenga en cuenta que en VB.NET no hay ningún problema para usar el primer fragmento, funciona muy bien, VB es flexible, ¡no puedo acostumbrarme a la rigidez de C #!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
fuente
fuente
Respuestas:
Con EF v4 puedes usar
SqlFunctions.StringConvert
. No hay sobrecarga para int, por lo que debe convertir a un doble o un decimal. Su código termina luciendo así:fuente
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Resolví un problema similar colocando la conversión del entero a la cadena fuera de la consulta. Esto se puede lograr poniendo la consulta en un objeto.
fuente
Utilice LinqToObject: contactos. AsEnumerable ()
fuente
AsEnumerable
, pagará un precio de alto rendimiento en bases de datos más grandes porque traerá todo a la memoria.IEnumerable
es más lento en comparación conIQueryable
porque el último se ejecuta exclusivamente en la base de datos.SqlFunctions.StringConvert funcionará, pero me resulta engorroso, y la mayoría de las veces, no tengo una necesidad real de realizar la conversión de cadenas en el lado de SQL.
Lo que hago si quiero hacer manipulaciones de cadenas es realizar primero la consulta en linq-to-persons, luego manipular las picaduras en linq-to-objects. En este ejemplo, quiero obtener un conjunto de datos que contengan el nombre completo de un contacto y ContactLocationKey, que es la concatenación de cadenas de dos columnas enteras (ContactID y LocationID).
Ahora, reconozco que se vuelve engorroso tener que escribir dos selecciones anónimas, pero argumentaría que esto se ve superado por la conveniencia de que puede realizar funciones de cadena (y otras) no admitidas en L2E. También tenga en cuenta que probablemente haya una penalización de rendimiento al usar este método.
fuente
fuente
return list.ToList();
!return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();
. Hacerlo de esta manera solo obtiene el id / nombre de la base de datos (en lugar de todas las propiedades del cliente) y realiza la clasificación utilizando el índice más eficiente en la base de datos.En primer lugar, convertir a objeto, luego toString () será correcto.
fuente
¡La respuesta de Brian Cauthon es excelente! Solo una pequeña actualización, para EF 6, la clase se movió a otro espacio de nombres. Entonces, antes de EF 6, debe incluir:
Si actualiza a EF 6, o simplemente está usando esta versión, incluya:
Al incluir el espacio de nombres incorrecto con EF6, el código se compilará bien pero arrojará un error de tiempo de ejecución. Espero que esta nota ayude a evitar cierta confusión.
fuente
Me encontré con este mismo problema cuando estaba convirtiendo mi aplicación MVC 2 a MVC 3 y solo para dar otra solución (limpia) a este problema, quiero publicar lo que hice ...
GetProducers () simplemente devuelve una colección de entidades de Productores. PD: El SqlFunctions.StringConvert no funcionó para mí.
fuente
Si su "contacto" está actuando como una lista genérica, espero que el siguiente código funcione bien.
Gracias.
fuente
Una solución mas:
Simplemente agregue una cadena vacía y se convertirá en cadena.
fuente
Usando MySql,
SqlFunctions.StringConvert
no funcionó para mí. Como utilizoSelectListItem
en más de 20 lugares en mi proyecto, quería una solución que funcionara sin distorsionar las más de 20 declaraciones LINQ. Mi solución fue subclasificarSelectedListItem
para proporcionar un configurador de enteros, que aleja la conversión de tipos de LINQ. Obviamente, esta solución es difícil de generalizar, pero fue bastante útil para mi proyecto específico.Para usar, cree el siguiente tipo y utilícelo en su consulta LINQ en lugar de
SelectedListItem
IntValue en lugar de Value.fuente
si usa el marco de la entidad y desea hacer que el único int sea aceptable, puede usar esto en la consulta linq, puede probar esto
funcionará porque el uso de (int) arrojará su valor a int, por lo que no necesita ninguna conversión de cadena a int y obtendrá el resultado que desea.
esto funcionó para mí en mi proyecto, creo que sería útil para usted
fuente
Entiendo que debe crear una clase parcial para "extender" su modelo y agregar una propiedad que sea de solo lectura que pueda utilizar el resto de las propiedades de la clase.
Luego
fuente
Descubrí que
SqlFunctions.StringConvert((double)c.Age)
no funcionaba para mí, el campo es de tipoNullable<Int32>
Me llevó mucha búsqueda en los últimos días de prueba y error para encontrar esto.
Espero que esto ayude a algunos codificadores.
fuente
System.String Concat(System.Object)
no se puede traducir a una expresión de tienda ... ".Puedes intentar:
fuente