Pregunta

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 al usar el primer fragmento, funciona muy bien, VB es flexible, ¡no puedo acostumbrarme al rigor de C#!

¿Fue útil?

Solución

Con v4 EF puede utilizar SqlFunctions.StringConvert . No hay ninguna sobrecarga para int por lo que necesita para echar a un doble o un número decimal. Su 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
            };

Otros consejos

I resuelto un problema similar mediante la colocación de la conversión del número entero a cadena 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 });
}

Uso LinqToObject:. Contactos AsEnumerable ()

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

SqlFunctions.StringConvert va a funcionar, pero me resulta engorroso, y la mayoría de las veces, no tengo una necesidad real para llevar a cabo la conversión de cadenas en el lado de SQL.

¿Qué hago si quiero hacer manipulaciones cadena se realice la consulta en LINQ a las entidades primera y la manipulan las picaduras de LINQ a objetos. En este ejemplo, quiero obtener un conjunto de datos que contienen nombre completo de un contacto, y ContactLocationKey, que es la de concatenar cadena de dos columnas de tipo entero (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, haz que se pone engorroso tener que escribir dos selecciona anónimos, pero yo diría que se ve compensado por la conveniencia de que se puede llevar a cabo de cuerda (y otros) las funciones no admitidas en L2E. También hay que tener en cuenta que es probable que haya una reducción del rendimiento utilizando este método.

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 selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

En primer lugar, convertir a objeto, entonces toString () será correcta.

respuesta

de Brian Cauthon es excelente! Sólo un poco de actualización, para EF 6, la clase tuvimos que cambiar a otro espacio de nombres. Por lo tanto, antes de EF 6, que debe incluir:

System.Data.Objects.SqlClient

Si actualiza a EF 6, o simplemente están utilizando esta versión, se incluyen:

System.Data.Entity.SqlServer

Al incluir el espacio de nombres incorrectos con EF6, el código se compilará muy bien, pero arrojará un error de ejecución. Espero que esta nota ayuda a evitar alguna confusión.

Me encontré con este mismo problema cuando yo estaba en la conversión de mi aplicación MVC 2 a 3 MVC y justo 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 entidad de Productores. PD El SqlFunctions.StringConvert no funcionó para mí.

Si su "contacto" está actuando como lista genérica, espero que el siguiente código funciona bien.

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

Gracias.

Usando MySQL, el SqlFunctions.StringConvert no funcionó para mí.desde que uso SelectListItem en más de 20 lugares de mi proyecto, quería una solución que funcionara sin distorsionar las más de 20 declaraciones LINQ.Mi solución fue subclasificar SelectedListItem para proporcionar un definidor de números enteros, que aleja la conversión de tipos de LINQ.Obviamente, esta solución es difícil de generalizar, pero fue muy útil para mi proyecto específico.

Para usarlo, cree el siguiente tipo y utilícelo en su consulta LINQ en lugar de SelectedListItem y utilice IntValue en lugar de Valor.

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 + ""

Sólo tiene que añadir cadena vacía y se convierte en cadena.

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

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

Funcionará porque el uso (int) convertirá 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 ti.

Mi entendimiento es que usted tiene que crear una clase parcial para "extender" su modelo y añadir una propiedad que es de sólo lectura que se puede 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
};
var items = from c in contacts
select new ListItem
{
    Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
    Text = c.Name
};

He descubierto que SqlFunctions.StringConvert((double)c.Age) no funcionó para mí, ya sea el campo es de tipo Nullable<Int32>

Me llevó un montón de búsqueda en los últimos días de ensayo y error para encontrar esto.

Espero que esto ayuda a unos codificadores por ahí.

Se puede tratar:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top