none
consulta linq no devuelve lo esperado RRS feed

  • Pregunta

  • resulta que tengo la siguiente consulta en linq.

    model.Licitaciones = db.Licitacion
                .Where(
                    x =>                   
                    (model.NOLICITACION == null || x.NOLICITACION.ToUpper().Contains(model.NOLICITACION.ToUpper()))
                    || ((int?)model.EJERCICIO == null || (int?)x.EJERCICIO == model.EJERCICIO)
                    || ((int?)model.TIPOCOMPRAID == null || (int?)x.TIPOCOMPRAID == model.TIPOCOMPRAID)
                    )
                 .OrderBy(model.Sort + " " + model.SortDir)
                 .Skip((model.Page - 1) * model.PageSize)
                 .Take(model.PageSize)
                 .ToList();

    sin embargo cuando paso un solo valor model.NOLICITACION O EJERCICIO O TIPODECOMPRA NO FUNCIONA.

    pero cuando pado por ejemplo el ejercicio y el tipodecompra devuelve registro.

    que estoy haciendo mal; necesito que la consulta funcione con un solo parametro.


    Horacio Xochitemol Bautista

    • Cambiado Sergio Parra lunes, 20 de junio de 2016 8:22 Pregunta linq
    martes, 14 de junio de 2016 1:35

Todas las respuestas

  • Hola, probá sacar el método de selección a uno no anónimo así podes depurar un poquito mejor:

    model.Licitaciones = db.Licitacion
                .Where(x => EsSeleccionable(x, model))
                 .OrderBy(model.Sort + " " + model.SortDir)
                 .Skip((model.Page - 1) * model.PageSize)
                 .Take(model.PageSize)
                 .ToList();
    
    
    
    bool EsSeleccionable(Licitacion x, Cander model)
    {
      var c1 = model.NOLICITACION == null || x.NOLICITACION.ToUpper().Contains(model.NOLICITACION.ToUpper());
    
      var c2 = (int?)model.EJERCICIO == null || (int?)x.EJERCICIO == model.EJERCICIO;
    
      var c3 = (int?)model.TIPOCOMPRAID == null || (int?)x.TIPOCOMPRAID == model.TIPOCOMPRAID;
    
      return c1 || c2 || c3;
    }

    Salu2


    martes, 14 de junio de 2016 4:19
  • hola

    para que necesitas castear a "int?" ?  se supone que las propiedades deberias ser del tipo que soporte nulable

    ademas lo que noto es que los parentesis estan definidos de forma incorrecta

    .Where(
    	x =>                   
    	(model.NOLICITACION == null || x.NOLICITACION.ToUpper().Contains(model.NOLICITACION.ToUpper()))
    	&& ((!model.EJERCICIO.HasValue) || x.EJERCICIO == model.EJERCICIO.Value)
    	&& ((!model.TIPOCOMPRAID.HasValue) || x.TIPOCOMPRAID == model.TIPOCOMPRAID.Value)
    	)

    si tienes que castear algo a "int?" es porque algo esta mal pensado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 14 de junio de 2016 11:42
  • hola de antemano gracias por responder el modelo   es el siguiente.

     public int EJERCICIO { get; set; }
     public int TIPOCOMPRAID { get; set; }
     public string NOLICITACION { get; set; }
    
    

    entonces la verdad no se como hacer la consulta; ya lei el manual de linq pero hay cosas que no me quedan muy claras, agradecere su ayuda.


    Horacio Xochitemol Bautista

    martes, 14 de junio de 2016 14:34
  • pero no puedes hacer una consulta condicional si las propiedades no permiten nulo

    deberias definir

     public int? EJERCICIO { get; set; }

    para que aplique lo que estas queriendo realizas

    o sino crea una entidad separada para aplicar el filtro

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 14 de junio de 2016 14:45
  • hola amigos muchas gracias; como siempre leandro gracias por tu ayuda cambie los datos en el modelo y funciono.

    public string NOLICITACION { get; set; }
    public int? EJERCICIO { get; set; }
    public int? TIPOCOMPRAID { get; set; }

    la verdad no me queda muy claro linq, pero seguire aprendiendo.

    saludos.y muchas gracias


    Horacio Xochitemol Bautista

    martes, 14 de junio de 2016 15:02