Problema al convertir int a cadena en Linq a entidades

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 que pueda lograr esto? Tenga en cuenta que en VB.NET no hay problema, utilice el primer fragmento, funciona muy bien, VB es flexible, ¡no puedo acostumbrarme al rigor de C #!

Con EF v4 puede usar SqlFunctions.StringConvert . No hay sobrecarga para int, por lo que necesita convertir a doble o decimal. Tu código termina luciendo así:

 var items = from c in contacts select new ListItem { Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(), Text = c.Name }; 

Resolví un problema similar al colocar la conversión del entero en cadena fuera de la consulta. Esto se puede lograr colocando la consulta en un objeto.

 var items = from c in contacts select new { Value = c.ContactId, Text = c.Name }; var itemList = new SelectList(); foreach (var item in items) { itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name }); } 

Use LinqToObject: contactos. AsEnumerable ()

 var items = from c in contacts.AsEnumerable() select new ListItem { Value = c.ContactId.ToString(), Text = c.Name }; 
 public static IEnumerable GetCustomerList() { using (SiteDataContext db = new SiteDataContext()) { var list = from l in db.Customers.AsEnumerable() orderby l.CompanyName select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName }; return list.ToList(); } } 

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 cadena en el lado de SQL.

Lo que hago si quiero hacer manipulaciones de cadenas es realizar la consulta en linq-to-entities primero, luego manipular las picaduras en linq-to-objects. En este ejemplo, quiero obtener un conjunto de datos que contiene el nombre completo de un contacto y ContactLocationKey, que es la cadena de concatenación de dos columnas enteras (ContactID y LocationID).

 // perform the linq-to-entities query, query execution is triggered by ToArray() var data = (from c in Context.Contacts select new { c.ContactID, c.FullName, c.LocationID }).ToArray(); // at this point, the database has been called and we are working in // linq-to-objects where ToString() is supported // Key2 is an extra example that wouldn't work in linq-to-entities var data2 = (from c in data select new { c.FullName, ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(), Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString()) }).ToArray(); 

Ahora bien, concedo que resulta engorroso tener que escribir dos selecciones anónimas, pero yo diría que esto se ve compensado por la conveniencia de que puede realizar cadenas (y otras) funciones no admitidas en L2E. También tenga en cuenta que probablemente haya una penalización de rendimiento con este método.

 var selectList = db.NewsClasses.ToList().Select(a => new SelectListItem({ Text = a.ClassName, Value = a.ClassId.ToString() }); 

En primer lugar, convertir a objeto, luego toString () será correcto.

Me encontré con este mismo problema cuando estaba convirtiendo mi aplicación MVC 2 a MVC 3 y simplemente para dar otra solución (limpia) a este problema, quiero publicar lo que hice …

 IEnumerable producers = new SelectList(Services.GetProducers(), "ID", "Name", model.ProducerID); 

GetProducers () simplemente devuelve una colección de entidades de Productores. PD: SqlFunctions.StringConvert no funcionó para mí.

Si su “contacto” está actuando como una lista genérica, espero que el siguiente código funcione bien.

 var items = contact.Distinct().OrderBy(c => c.Name) .Select( c => new ListItem { Value = c.ContactId.ToString(), Text = c.Name }); 

Gracias.

¡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, debes incluir:

 System.Data.Objects.SqlClient 

Si actualiza a EF 6, o simplemente está usando esta versión, incluya:

 System.Data.Entity.SqlServer 

Al incluir el espacio de nombres incorrecto con EF6, el código comstackrá muy bien, pero emitirá un error de tiempo de ejecución. Espero que esta nota ayude a evitar cierta confusión.

Usando MySql, SqlFunctions.StringConvert no funcionó para mí. Como utilizo SelectListItem en más de 20 lugares en mi proyecto, quería una solución que funcionara sin contorsionar las más de 20 declaraciones LINQ. Mi solución fue subclasificar SelectedListItem para proporcionar un setter entero, que aleja la conversión de tipo 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 uso en su consulta LINQ en lugar de SelectedListItem y use IntValue en lugar de Value.

 public class BtoSelectedListItem : SelectListItem { public int IntValue { get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); } set { Value = value.ToString(); } } } 

Una solución más:

 c.ContactId + "" 

Solo agrega cadena vacía y se convertirá en cadena.

si usa el marco de la entidad y desea hacer que el único int sea aceptable, entonces puede usar esto en la consulta de linq, puede intentar esto

 var items = from c in contacts select new ListItem { Value = (int)ContractId Text = c.Name }; 

Funcionará porque usar (int) arrojará su valor al int para que no necesite 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

La forma más simple:

 var items = from c in contacts select new ListItem { Value = c.ContactId + "", Text = c.Name }; 

Tengo entendido que debe crear una clase parcial para “extender” su modelo y agregar una propiedad que sea de solo lectura y que pueda utilizar el rest de las propiedades de la clase.

 public partial class Contact{ public string ContactIdString { get{ return this.ContactId.ToString(); } } } 

Entonces

 var items = from c in contacts select new ListItem { Value = c.ContactIdString, Text = c.Name }; 
 var items = from c in contacts select new ListItem { Value = String.Concat(c.ContactId), //This Works in Linq to Entity! Text = c.Name }; 

Encontré que SqlFunctions.StringConvert((double)c.Age) no me funcionaba, el campo es de tipo Nullable

Me llevó mucho buscando en los últimos días de prueba y error para encontrar esto.

Espero que esto ayude a algunos codificadores por ahí.

Puedes intentar:

 var items = from c in contacts select new ListItem { Value = Convert.ToString(c.ContactId), Text = c.Name };