none
DropDownList con Datos Distintos RRS feed

  • Pregunta

  • Buenas, tengo un problema al querer generar un DropDownList a partir de los datos de una tabla, el problema es que los datos a utilizarse no son unicos, por tanto debo generar un Distinct (en este caso el campo al que quiero hacer el Distinct es al campo mes). El controlador lo estoy manejando de la siguiente forma:

      

    public ActionResult Index()        {            var Planes = db.PGC_ASIGNADOS.Include(p => p.EJECUTIVO_ASIGNADO);	    ViewData["Mes"] = new SelectList(Planes.Distinct(), "Mes", "Mes");           return View(Planes.ToList());	    }

    Ya en la vista intento:

    @Html.DropDownList("Mes", ViewData["Mes"] as SelectList) 

    Pero lo que se me genera es un DropDown con Todos los meses pero repetidos (tal y como estan en la BD). 

    Muchas gracias por la ayuda, estaré muy agradecido

    lunes, 14 de diciembre de 2015 21:57

Todas las respuestas

  • hola

    Entiendo usas entity framework, no ?

    Si es asi recuerda que Distinct() con objeto requiere que le indiques que propiedad usar para validar si es repetido o no

    Para esto implementa la interfaz IEquatable<> en la clase que seleccionas con linq

    [Linq] Distinct y GroupBy usando IEquatable<>

    De esta forma indicas como resueleve que es lado es distinto cuando usas objetos, por defecto linq lo aplica por referencia al objeto por eso todos son distintos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 14 de diciembre de 2015 23:13
  • Hola Leandro, 
    Muchas gracias por la respuesta, efectivamente como dices estoy utilizando el EntityFramework para la creación de mis clases, ya hice la implementación del IEquatable<> de la siguiente forma:
            public class MesComparer : IEqualityComparer<Mes>
            {
                public bool Equals(Mes x, Mes y)
                {
                    return x.id == y.id;
                }
    
                public int GetHashCode(Mes obj)
                {
                    return obj.id.GetHashCode();
                }
            }


    El problema es cuando quiero enviar el valor del "Mes" ya con el distinct al DropDown, actualmente lo hago de esta forma:
    ViewData["Mes"]         = new SelectList(from s in Plan
                                                 select new Mes
                                                 {
                                                     id = s.MES,
                                                     MesName = s.MES
                                                 });


    Ya en la vista hago la llamada de la siguiente forma:

    @Html.DropDownList("id", ViewData["Mes"] as SelectList)



    Pero en el dropdown aparece información no logica, no aparece el número que representa al mes
    martes, 15 de diciembre de 2015 16:33
  • hola

    Pero cuando armas el linq usas el mismo s.MES para el id y el MesName no veo que tenga un numero o descripcion, quizas deberias cambiar la asignacion del id en el linq para que asigne un numero

    igual lo que no veo es donde aplicas el MesComparer, ya que deberia ser

    ViewData["Mes"]         = new SelectList(from s in Plan
                                                 select new Mes
                                                 {
                                                     id = s.MES,
                                                     MesName = s.MES
                                                 }).Distinct(new MesComparer());

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 15 de diciembre de 2015 17:02
  • Hola Leandro,

    Es cierto, dejé el mismo dato, lo cambié y también cambié la aplicación del para poder llamar al "MesComparer", el problema es que al hacer la llamada como me indicas: 

    ViewData["Mes"] = new SelectList(from s in Plan
                                                 select new Mes
                                                 {
                                                     id = s.MES,
                                                     MesName = s.FCH_PROCESO
                                                 }).Distinct(new MesComparer());

    Me aparece el siguiente error: 

    Error	1	'System.Web.Mvc.SelectList' does not contain a definition for 'Distinct' and the best extension method overload 'System.Linq.ParallelEnumerable.Distinct<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments	
    

    martes, 15 de diciembre de 2015 18:25
  • hola

    disculpa no vi que habias definido un SelectList

    en ese caso seria

    var result = (from s in Plan
    				 select new Mes
    				 {
    					 id = s.MES,
    					 MesName = s.FCH_PROCESO
    				 }).Distinct(new MesComparer());
    		
    ViewData["Mes"] = new SelectList(result);

    sino toma el Distinct() en medio usa un ToList()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de diciembre de 2015 18:43
  • Hola Leandro, 

    Muchisimas gracias, ya así pude realizar bien la funcion de Distinct de la siguiente forma: 

                var meses = (from s in Plan
                             select new Mes
                                  {
                                      id = s.MES,
                                      MesName = s.MES.ToString()
                                  }).ToList().Distinct(new MesComparer());
                ViewData["Mes"] = new SelectList(meses);

    El problema que en la vista al hacer la invocación: 

    @Html.DropDownList("MesName", ViewData["Mes"] as SelectList)
     

    El problema que al depurar y ver el resultado, en el dropdown no aparece la información como debería, si no que en su lugar aparece dentro del DropDown varias lineas repitiendo información: NombreAplicativo.Models.Mes

    De antemano muchísimas gracias y perdón si pregunto mucho pero me estoy prácticamente iniciando en el uso de MVC.

    Saludos.

    martes, 15 de diciembre de 2015 23:15