none
Manejar dinamicamente criterios con linq to entities RRS feed

  • Pregunta

  • Estimada Comunidad

    Tengo los siguientes Métodos en la capa Datos:

           public static List<CLIENTES> GetListClientesSegPat (int añoVcto, int mesVcto, int codigoDpto)
            {

                using (RSAEntities db = new RSAEntities())
                {

                    var query = from cl in db.CLIENTES
                                where (from pr in db.POLIZAS_RENOV
                                       join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
                                       join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
                                       where pr.CLI_CODIGO == cl.CLI_CODIGO
                                          && pr.POLI_ANO_REN == añoVcto
                                          && pr.POLI_MES_REN == mesVcto
                                          && ca.DEP_CODIGO == codigoDpto
                                       select pr).Any()
                                       orderby cl.CLI_NOMBRE
                                select cl;

                    return query.ToList();
                }
            }

            public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo)
            {
                using (RSAEntities db = new RSAEntities())
                {

                    var query = from cl in db.CLIENTES
                                where (from pr in db.POLIZAS_RENOV
                                       join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
                                       join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
                                       where pr.CLI_CODIGO == cl.CLI_CODIGO
                                          && pr.POLI_ANO_REN == añoVcto
                                          && pr.POLI_MES_REN == mesVcto
                                          && ca.DEP_CODIGO == codigoDpto
                                          && pr.POLI_VENDEDOR2 == codigoEjecutivo
                                       select pr).Any()
                                orderby cl.CLI_NOMBRE
                                select cl;

                    return query.ToList();

                }
            }

            public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo, int estado)
            {
                using (RSAEntities db = new RSAEntities())
                {

                    var query = from cl in db.CLIENTES
                                where (from pr in db.POLIZAS_RENOV
                                       join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
                                       join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
                                       where pr.CLI_CODIGO == cl.CLI_CODIGO
                                          && pr.POLI_ANO_REN == añoVcto
                                          && pr.POLI_MES_REN == mesVcto
                                          && ca.DEP_CODIGO == codigoDpto
                                          && pr.POLI_VENDEDOR2 == codigoEjecutivo
                                          && pr.EST_CODIGO == estado
                                       select pr).Any()
                                orderby cl.CLI_NOMBRE
                                select cl;

                    return query.ToList();

                }
            }

    Como se puede observar es el mismo metodo recargado, el segundo metodo con 4 parametros y el tercer metodo con 5 parametros.

    En mi capa de negocios lo manejo de la siguiente manera:

            public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo, int estado)
            {
                if (codigoEjecutivo != -1 && estado != -1)
                {
                    return DClientes.GetListClientesSegPat(añoVcto, mesVcto, codigoDpto,codigoEjecutivo, estado);
                }
                else if (codigoEjecutivo != -1 && estado == -1)
                {
                    return DClientes.GetListClientesSegPat(añoVcto, mesVcto, codigoDpto, codigoEjecutivo);
                }
                else
                {
                    return DClientes.GetListClientesSegPat(añoVcto, mesVcto, codigoDpto);
                }
            }

    Existe alguna manera en la pueda codificar segun el contenido de las variables, decir,

    if codigoEjecutivo = -1 no filtrar por este criterio caso contrario si lo haga??

    de la misma manera para

    if estado == -1 no filtrar por este criterio caso contrario si lo haga??

    y asi de esta manera tener un solo metodo??.

    Desde ya les agradezco por su amable ayuda.

    Guivan

    jueves, 4 de julio de 2019 22:23

Respuestas

  • hola

    >>Existe alguna manera en la pueda codificar segun el contenido de las variables, decir, if codigoEjecutivo = -1 no filtrar por este criterio caso contrario si lo haga??

    si en el linq en el where debes validar el valor que defines como default para ese parametro, en tu caso el -1

    algo como esto

    public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo, int estado)
    {
    	using (RSAEntities db = new RSAEntities())
    	{
    
    		var query = from cl in db.CLIENTES
    					where (from pr in db.POLIZAS_RENOV
    						   join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
    						   join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
    						   where pr.CLI_CODIGO == cl.CLI_CODIGO
    							  && pr.POLI_ANO_REN == añoVcto
    							  && pr.POLI_MES_REN == mesVcto
    							  && ca.DEP_CODIGO == codigoDpto
    							  && ((codigoEjecutivo == -1) || (pr.POLI_VENDEDOR2 == codigoEjecutivo))
    							  && pr.EST_CODIGO == estado
    						   select pr).Any()
    					orderby cl.CLI_NOMBRE
    					select cl;
    
    		return query.ToList();
    
    	}
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 5 de julio de 2019 3:23

Todas las respuestas

  • Hola

    revisando como quedaría la consulta yo lo haría de esta manera

    mas o menos

    primero el cuatro y quinto parámetro lo igualo a -1 como disparador

    y de esa manera los dos últimos parámetros son opcionales

     public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo =-1 , int estado = -1)
            {
                using (RSAEntities db = new RSAEntities())
                {
    
                    var query = from cl in db.CLIENTES
                        where (from pr in db.POLIZAS_RENOV
                            join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
                            join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
                            where pr.CLI_CODIGO == cl.CLI_CODIGO
                                  && pr.POLI_ANO_REN == añoVcto
                                  && pr.POLI_MES_REN == mesVcto
                                  && ca.DEP_CODIGO == codigoDpto
                            //&& pr.POLI_VENDEDOR2 == codigoEjecutivo
                            //&& pr.EST_CODIGO == estado
                            select pr).Any()
                        orderby cl.CLI_NOMBRE
                        select cl;
                    if (codigoEjecutivo >= 0)
                        query = from cl in query
                            where cl.POLI_VENDEDOR2 == codigoEjecutivo
                            select cl;
                    if (estado >= 0)
                        query = from cl in query
                            where cl.EST_CODIGO == estado
                            select cl;
    
                    return query.ToList();
    
                }

    espero te sirva
    viernes, 5 de julio de 2019 2:40
  • hola

    >>Existe alguna manera en la pueda codificar segun el contenido de las variables, decir, if codigoEjecutivo = -1 no filtrar por este criterio caso contrario si lo haga??

    si en el linq en el where debes validar el valor que defines como default para ese parametro, en tu caso el -1

    algo como esto

    public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo, int estado)
    {
    	using (RSAEntities db = new RSAEntities())
    	{
    
    		var query = from cl in db.CLIENTES
    					where (from pr in db.POLIZAS_RENOV
    						   join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
    						   join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
    						   where pr.CLI_CODIGO == cl.CLI_CODIGO
    							  && pr.POLI_ANO_REN == añoVcto
    							  && pr.POLI_MES_REN == mesVcto
    							  && ca.DEP_CODIGO == codigoDpto
    							  && ((codigoEjecutivo == -1) || (pr.POLI_VENDEDOR2 == codigoEjecutivo))
    							  && pr.EST_CODIGO == estado
    						   select pr).Any()
    					orderby cl.CLI_NOMBRE
    					select cl;
    
    		return query.ToList();
    
    	}
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 5 de julio de 2019 3:23
  • Gracias Leandro por tu amable ayuda.

    Efectivamente funciono perfectamente quedado el metodo asi;

    public static List<CLIENTES> GetListClientesSegPat(int añoVcto, int mesVcto, int codigoDpto, int codigoEjecutivo, int estado)
    {
        using (RSAEntities db = new RSAEntities())
        {

            var query = from cl in db.CLIENTES
                        where (from pr in db.POLIZAS_RENOV
                               join po in db.POLIZAS on pr.POLI_NUM equals po.POLI_NUM
                               join ca in db.CANALES on po.CAN_CODIGO equals ca.CAN_CODIGO
                               where pr.CLI_CODIGO == cl.CLI_CODIGO
                                  && pr.POLI_ANO_REN == añoVcto
                                  && pr.POLI_MES_REN == mesVcto
                                  && ca.DEP_CODIGO == codigoDpto
                                  && ( (codigoEjecutivo == -1) || (pr.POLI_VENDEDOR2 == codigoEjecutivo) )
                                  && ( (estado == -1) || (pr.EST_CODIGO == estado))
                               select 1).Any()
                        orderby cl.CLI_NOMBRE
                        select cl;

            return query.ToList();

        }
    }

    La verdad no entiendo la lógica que aplicas, pero funciona excelente, lo revisare en mas detalle.

    Gracias nuevamente,

    Saludos

    Guivan

    viernes, 5 de julio de 2019 16:10
  • Hola Marti.

    Pero el campo poli_vendedor2 no pertenece a tabla clientes sino a la tabla polizas_renov que esta como subquery haciendo un exists.

    viernes, 5 de julio de 2019 16:19