c# - net - linq parse int
Problema al convertir int a string en linq a entidades (16)
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 manera puedo lograr esto? Tenga en cuenta que en VB.NET no hay ningún problema, use el primer fragmento de código. Funciona simplemente bien, VB es flexible, no puedo acostumbrarme al rigor de C #.
¡La respuesta de Brian Cauthon es excelente! Solo una pequeña actualización, para EF 6, la clase se trasladó 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 se compilará bien pero generará un error de tiempo de ejecución. Espero que esta nota ayude a evitar alguna confusión.
Con EF v4 puedes usar SqlFunctions.StringConvert
. No hay sobrecarga para int, por lo que debe convertir a doble o decimal. Tu código termina pareciéndose a esto:
var items = from c in contacts
select new ListItem
{
Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
Text = c.Name
};
La forma más sencilla:
var items = from c in contacts
select new ListItem
{
Value = c.ContactId + "",
Text = c.Name
};
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 ...
IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
"ID", "Name", model.ProducerID);
GetProducers () simplemente devuelve una colección de entidades de productores. PS The SqlFunctions.StringConvert no funcionó para mí.
Puedes intentar:
var items = from c in contacts
select new ListItem
{
Value = Convert.ToString(c.ContactId),
Text = c.Name
};
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.
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 });
}
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.
Si usa el framework de entidades y desea que el único int sea aceptable, entonces puede usar esto en la consulta de linq, puede probar esto
var items = from c in contacts
select new ListItem
{
Value = (int)ContractId
Text = c.Name
};
funcionará porque usar (int) convertirá su valor en el int, por lo que no necesita ninguna conversión de cadena a int y obtiene el resultado que desea.
esto funcionó para mí en mi proyecto, creo que sería útil para usted
SqlFunctions.StringConvert funcionará, pero me resulta incómodo, 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 primero la consulta en linq-to-enters, luego manipular las picaduras en linq-to-objects. En este ejemplo, deseo obtener un conjunto de datos que contengan el nombre completo de un contacto y ContactLocationKey, que es la concatinación de cadenas 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, concedo que es incómodo tener que escribir dos selecciones anónimas, pero diría que eso se ve superado por la conveniencia de que puede realizar funciones de cadena (y otras) no compatibles con L2E. También tenga en cuenta que probablemente exista una penalización de rendimiento con este método.
Tengo entendido 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.
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
};
Una solución más:
c.ContactId + ""
Simplemente agregue una cadena vacía y se convertirá en una cadena.
Usando MySql, SqlFunctions.StringConvert
no funcionó para mí. Ya que uso SelectListItem
en más de 20 lugares en mi proyecto, quería una solución que funcionara sin tener que retorcer las más de 20 declaraciones LINQ. Mi solución fue subdividir SelectedListItem
para proporcionar un configurador de enteros, lo que aleja la conversión de tipo de LINQ. Obviamente, esta solución es difícil de generalizar, pero fue muy útil para mi proyecto específico.
Para usar, cree el siguiente tipo y use 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(); }
}
}
Utilice LinqToObject: contactos. AsEnumerable ()
var items = from c in contacts.AsEnumerable()
select new ListItem
{
Value = c.ContactId.ToString(),
Text = c.Name
};
public static IEnumerable<SelectListItem> 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();
}
}
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 funcionó para mí, ya que el campo es de tipo Nullable<Int32>
Me costó mucho buscar en los últimos días de prueba y error para encontrar esto.
Espero que esto ayude a algunos codificadores por ahí.
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
Text = a.ClassName,
Value = a.ClassId.ToString()
});
En primer lugar, convierta a objeto, luego aString () será correcto.