none
Filtrar sobre lista anidada RRS feed

  • Pregunta

  • Hola, tengo una consulta:

    Necesito hacer dos filtros sobre una lista,el primero es sobre una propiedad común y no hay inconvenientes. El segundo es sobre una propiedad de tipo lista y no se como hacer para poder acceder a las propiedades de los elementos que tengo en ésta segunda lista.

    El primer filtro que hago es el siguiente:

    var resultado = from t in lstEquipos where t.Marca.Id_Marca == marca select t;

     

    Donde lstEquipos es una lista que contiene objetos del tipo Equipo:

            List<Equipo> lstEquipos = new List<Equipo>();

    A su vez cada equipo tiene la siguiente propiedad:

            public List<Funcion> Funciones_Telefono
            {
                get { return _funciones; }
                set { _funciones = value; }
            }

    Y la clase Funcion tiene una propiedad sobre la que quiero filtrar llamada "Estado".

     

    Si alguien puede darme una mano estaría muy agradecido.

    jueves, 16 de junio de 2011 2:00

Respuestas

  • Hola Marcelo

    Ya pudiste lograrlo? si no aqui te dejo una posible solucion... no la he probado asi que no te puedo asegurar que funcionara

    var resultado = from t in lstTelefonos
                from f in t.Funciones
                where (f.Estado == "activo" && f.Id == funcion) && t.Marca.Id_Marca == marca   
                select t;
    

     

    Saludos


    Antonio Lobo
    Mi Blog
    • Marcado como respuesta Marcelo Q martes, 21 de junio de 2011 22:54
    martes, 21 de junio de 2011 15:26

Todas las respuestas

  • hola

    no serviria algo como esto

     

            public class Marca
            {
                public int Id_Marca {get; set;}
            }

            public class Funcion
            {
                public string Estado { get; set; }
            }

            public class Equipo
            {
                public Marca Marca { get; set; }
                public List<Funcion> Funciones_Telefono { get; set; }
            }

            private void button1_Click(object sender, EventArgs e)
            {

                List<Equipo> lstEquipos = new List<Equipo>();

                int marca = 1;
                string estado = "activo";

                var resultado = from t in lstEquipos
                                where t.Funciones_Telefono.Any(o=>o.Estado == estado)
                                        && t.Marca.Id_Marca == marca
                                select t;
            }

     

    veras que el estado filtra por si hay algun item en la lista con el estado que defines en el filtro, si hay algun estado activo entonces pasa, sino hay ninguna function activa no pasa

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 16 de junio de 2011 4:42
  • Muchas gracias por la respuesta Leandro, te comento que hice lo que me decís pero no me está filtrando bien.

     

    Filtra por la marca, pero no por la función. Si encuentra un equipo dentro de lstEquipos que tenga la Función con el estado "activo", trae todos los equipos de esa marca.

    También agregue una condición más, para que no solo valide el estado sino que también lo haga con el id de la función. Ya que la idea es que desde dos combos se pueda seleccionar una función y una marca y traiga solo los equipos de esa marca y que tengan esa función con estado "activo". Pero el resultado es el mismo que te comentaba más arriba.

                       var resultado = from t in lstTelefonos
                                        where t.Funciones_Telefono.Any(o => o.Estado == "activo" && o.Id_Funcion == funcion) && t.Marca.Id_Marca == marca
                                        select t;

     

    jueves, 16 de junio de 2011 22:23
  • pero porque has puesto lstTelefonos en el from

    from t in lstTelefonos

    tiene que pones la lista de quipos que tienen a su vez la marca, porque si pones la lsita de telefonos este puede contener solo una marca, no tiene sentido filtrar el el id de la amrca como lo haces porque simrpe sera una

    asdemas si con solo el filtro de activo no sale, no le agregies mas complejidad agregando al funciona, ve a partes, primero resuleve que retiene

    creo qdemas que no tienes claro quee s lo que necesitas, porque en el priemr pñlanteo lo hacias sobre la lsita dde equipos, y quwerias ver si habia telefonos activos, pero ahora este plantro cambio y lo haces sobre los telefonos

    pero si es sobre esta lista sua dos consultas, una priemr aque retirne los telefonos de la marca y luego otra query que vea si hay activos y para una funcion

    pero puedes hacerlo en dos consultas separadas, no tiene proque ser una sola

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 20 de junio de 2011 5:03
  • Leandro, la lista es la misma. La diferencia es que en el primer planteo lo hice sin el código a mano entonces los nombres variaron, pero la consulta es siempre la misma.

     

    La clase Teléfono tiene una propiedad de tipo List<Funcion> y otra propiedad del tipo Marca, la consulta sobre Marca es sencilla y ya está resuelta con un simpl:

    var resultado = from t in lstTelefonos where t.Marca.Id_Marca == marca;

    Esto lo hago ya que tengo una lista con "x" cantidad de Teléfonos, de distintas marcas, entonces ahí aplico el primer filtro. Pero a su vez, necesito filtrar por alguna función, por lo tanto la consulta era como recorrer la propiedad del tipo List<Funcion> cuando la tengo anidada dentro de la lista del tipo List<Telefono>

     

    Gracias.

    lunes, 20 de junio de 2011 23:11
  • Hola Marcelo

    Ya pudiste lograrlo? si no aqui te dejo una posible solucion... no la he probado asi que no te puedo asegurar que funcionara

    var resultado = from t in lstTelefonos
                from f in t.Funciones
                where (f.Estado == "activo" && f.Id == funcion) && t.Marca.Id_Marca == marca   
                select t;
    

     

    Saludos


    Antonio Lobo
    Mi Blog
    • Marcado como respuesta Marcelo Q martes, 21 de junio de 2011 22:54
    martes, 21 de junio de 2011 15:26
  • Muchas gracias Antonio, funciono a la perfección.

     

    Saludos.

    martes, 21 de junio de 2011 22:54