2011-12-13 12 views
10

Estoy intentando llenar un menú desplegable en mi vista. Cualquier ayuda es muy apreciada. Gracias.LINQ to Entities solo admite el moldeado de tipos primitivos de Entity Data Model?

error:

Unable to cast the type 'System.Int32' to type 'System.Object'.

LINQ to Entities only supports casting Entity Data Model primitive types.

controlador:

ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem() {Text=c.Name, Value=""+c.ID }).ToList<SelectListItem>(); 

Vista:

Category:<br />@Html.DropDownList("category", (List<SelectListItem>)ViewBag.category) 
+0

Linq to enitites no es compatible con este tipo de conversiones convert.Tostring() y convert.ToDatetime() .. –

Respuesta

19

¿Qué tal esto:

ViewBag.category = 
    from c in new IntraEntities().CategoryItems.ToList() 
    select new SelectListItem 
    { 
     Text = c.Name, 
     Value = c.ID.ToString() 
    }; 

y ¿qué tal si utilizamos modelos de vista fuertemente tipados en lugar de una mierda débilmente tipada de un ViewBag (así es como lo llamo)?

De esta manera:

public class CategoryViewModel 
{ 
    public string CategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

a continuación:

public ActionResult Foo() 
{ 
    var model = new CategoryViewModel 
    { 
     Categories = 
      from c in new IntraEntities().CategoryItems.ToList() 
      select new SelectListItem 
      { 
       Text = c.Name, 
       Value = c.ID.ToString() 
      } 
    }; 
    return View(model); 
} 

y, finalmente, en su opinión inflexible:

@model CategoryViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(x => x.CategoryId, Model.Categories) 
    <button type="submit">OK</button> 
} 

Mucho mejor, ¿no cree?

+9

@olivehour, no, no necesito más reputación. Solo quiero que la gente deje de usar esta basura de ViewBag y empiece a usar modelos de vista en sus aplicaciones ASP.NET MVC. –

+0

+1 nuevamente. Tengo desarrolladores en Bangalore que están haciendo esto. Voy a darles un enlace a esta página para mostrarles cómo los modelos de vista deben modelar listas de selección. – danludwig

+3

@olivehour, no, no les dé un enlace a esa página. Me refiero a que el ejemplo en esta página web está lejos de cualquier cosa que deba hacer en una aplicación real. Me refiero en este ejemplo a que el OP codifica directamente un LINQ-a-Entities o lo que sea que se llame DAL directamente en el controlador sin usar una abstracción y haciendo que este código sea completamente imposible de probar en forma aislada. Nunca debe tener su controlador fuertemente vinculado a una tecnología específica de acceso a datos como EF o lo que sea. Debes debilitar el acoplamiento entre las diferentes capas de tu aplicación mediante el uso de abstracciones. –

0
ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem {Text=c.Name, Value=c.ID.ToString()}) 
.ToList<SelectListItem>(); 
+0

No funcionó, pero gracias. "LINQ to Entities no reconoce el método 'System.String ToString()', y este método no se puede traducir a una expresión de tienda." – Ber53rker

+0

Lo sentimos, Darin vuelve a ser correcto: debe invocar .ToList() para ejecutar la consulta.Luego, LINQ to Objects reconocerá la llamada .ToString(). – danludwig

4

Puede convertir su consulta en .AsEnumerable() antes de la conversión para forzarlo a usar Linq en Objetos para la conversión, pero es mejor usar las funciones compatibles con SQL disponibles en System.Data.Objects.SqlClient. SqlFunctions así:

(from c in new IntraEntities().CategoryItems 
select new SelectListItem() { 
    Text = c.Name, 
    Value = SqlFunctions.StringConvert((double)c.ID).TrimStart() 
}) 
+4

Esta es una respuesta más aceptable para mí. La respuesta aceptada simplemente llama a ToList() en la colección, que probablemente no sea necesaria. Luego se desvía y da conferencias sobre el uso de las clases de viewmodel. – Sergio

0

El error dice, que están tratando de concat cadena con valor entero. No es posible en la consulta de linq. Para int convertir en cadena que puede utilizar

SqlFunctions.StringConvert((decimal?)intProperty) 
0

puede utilizar las funciones SQL para convertir así:

ViewBag.category = (from c in new IntraEntities().CategoryItems 
        select new SelectListItem() { 
Text=c.Name, 
Value=SqlFunctions.StringConvert((double) c.ID) }).ToList<SelectListItem>(); 

pero no se olvide de incluir este espacio de nombres en la parte superior de su archivo:

usando System.Data.Objects.SqlClient;

0

Sí, está intentando "concatenar cadena con valor entero. No es posible en la consulta de linq" tal como sugirió Nalan M. Asegúrese de que sea la columna de la base de datos que está tratando de obtener. Para mí eso es lo que era. Estaba especificando la columna equivocada. Llamaba a la clase porque aparentemente alguien hizo una clase para esa propiedad. Si está trabajando en Visual Studio, puede consultar la base de datos y ver a qué llama. De esta manera, puede responder la pregunta: "¿dónde está la columna que quiero?" en la base de datos.

Cuestiones relacionadas