none
filtrar con condiciones en linq RRS feed

  • Pregunta

  • anteriormente yo equivocadamente concatenaba una consulta, por ejemplo era un objeto medicamento con cuatro atribtuos

    preguntaba si el primero era null, si era null preguntaba por el segun, y asy al final automaticamente se me creaba la consulta segun los criterios escritos para buscar,

    pero cmo se implemente esto con linq

    lunes, 21 de mayo de 2012 17:58

Respuestas

  • lo usas

    int? valor = null; int temp=0; if(int.TryParse(textbox2.Text, out temp)){ valor = temp; }

    Buscar(valor, ...);

    como veras usas el valor como parametro, pasandole un null si es que el textbox no tiene info que usar para filtrar o sino parsea al tipo correcto


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel martes, 22 de mayo de 2012 20:38
    martes, 22 de mayo de 2012 17:53

Todas las respuestas

  • Hola,

    supongo que te refieres a los filtros condicionales. Básicamente en linq se sigue la misma dinámica. Por ejemplo

    var result = from p in DataContext.Medicamentos
      where (campo1 == null || p.Campo1 == campo1)
        && (campo2 == null || p.Campo2 == campo2) 
        // Resto de filtros
      select p;
     
    De todas formas, no estaría de más que pusieras que tienes hecho hasta ahora.


    Atentamente, Sergio.

    Blog
    Twitter

    lunes, 21 de mayo de 2012 18:07
  • Hola,

    Mira esta respuesta del foro que te puede aclarar bastantes conceptos.

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/09ef396e-81e4-4c60-b7c8-5929d71e1320

    Te recomiendo que revises el patrón specification. En la guia que te pase se habla de ello y en este enlace puedes ver el código fuente.

    http://microsoftnlayerapp.codeplex.com/ 

    Saludos,


    phurtado
    Mi Blog Blog
    Sigueme en Twitter

    lunes, 21 de mayo de 2012 19:05
    Moderador
  • preguntaba si el primero era null, si era null preguntaba por el segun, y asy al final automaticamente se me creaba la consulta segun los criterios escritos para buscar,

    de que tipo de datos estamos hablando, porque dices null, pero ojo porque si es un int, deberia ser un int?, o sea un valo nulable para que funcion

    o sea con linq la implementacion cambia segun que tipo de dato vas a usar, si es un textbox, podrias usar el string.IsNullOrEmpty(), pero si es un string esto no aplcia y debe ser un int?, con un int simple no funciona

    int? valor = null;  //aqui tomas un int que puede ser null sino tiene un valor numeri
    
    int temp=0;
    
    if(int.TryParse(textbox2.Text, out temp)){
    
        valor = temp;
    
    }
    
    var result = from item in lista
                       where ((string.IsNullOrEmpty(Textbox1.Text)) || (item.prop1 == Textbox1.Text))
                               && ((valor.HasValue) || (item.prop2 == valor.Value))
                       select item;

    al no haber parametros que normalicen como en la query aplcias la logica directo a los valores pore so difieres como tratas cada caso

    analiza como se convierte y toma el valor int, tiene su vuelta

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 21 de mayo de 2012 21:11
  • realmente no es textbox ni nada voy a poner el metodo como sergiom recomendo

    que es casi nada jejejje

    public static MedicamentosEntity Buscar(int aId, decimal aCodigo, int aIdCategoria, string aDescripcion)
            {
                int numero = 0;
    
                if (aId != null)
                {
                    //aqui se empieza a llenar la consulta con el id
                    if (aCodigo != null)
                    {
                        //aqui se usa and para buscar por el id y el codigo
                        if (aIdCategoria != null)
                        {
                            //se buscan con and el id el codigo y el idcategoria
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                    }
                    else
                    {
                        if (aIdCategoria != null)
                        {
                            //se buscan con and el id el codigo y el idcategoria
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                        else
                        {
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                        
                    }
                }
                else
                {
                    if (aCodigo != null)
                    {
                        //aqui se usa and para buscar por el codigo
                        if (aIdCategoria != null)
                        {
                            //se buscan con and codigo y el idcategoria
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                    }
                    else
                    {
                        if (aIdCategoria != null)
                        {
                            //se buscan el idcategoria
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                        else
                        {
                            if (aDescripcion != "")
                            {
                                //se busca por los cuatro parametros
                            }
                        }
                    }
                }
            }

    son demasiados if, pero asy lo hacia antes y concatenadaba la consulta en un string dependiendo la situacion, pero estaba checando lo de las listas del linq de pedro, pero no entiendo como funcionaria ya que aqui son diferentes tipos, les agradeceria su ayuda, si esta correcto lo que estoy haciendo o no???

    si es correcto como implemento linq en ves de concatenar siguiendo los if???

    y si esta mal pues hay un consejillo jejejeje??? ven hasta las preguntas las hago if ya jajajaja

    lunes, 21 de mayo de 2012 21:30
  • si es correcto como implemento linq en ves de concatenar siguiendo los if???

    pero ya dimos la respuesta, te decia si es string las variables usas el string.IsNullOrEmpty()

    ademas que secuancoa de if mas rara que implementas no aprece llevar una logica, porque al principio haces un if por el aId y de eso tomas un camino u otro

    no veo como aplciarias eso a un linq mas que aplicar o no el filtro por id

    where ((aId == null) || (ite.campo == aId))

    pero esto no condicina el resto de los parametros

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 21 de mayo de 2012 22:20
  • lo hice asy

    public static List<MedicamentosEntity> Buscar(decimal aCodigo, int aIdCategoria, string aDescripcion)
            {
                using (var context = new NombreDbDataContext(@"Data Source=SE0057D\sqlexpress;Initial Catalog=Enfermeria;Integrated Security=True"))
                {
                    var idMedicamentosQuery = from medic in context.Medicamentos
                                              select medic;
                    if (aCodigo != null)
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.Codigo == aCodigo);
    
                    if (aIdCategoria != null)
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.IdCategoria == aIdCategoria);
    
                    if (aDescripcion != "")
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.Descripcion == aDescripcion);
                    return idMedicamentosQuery.ToList();
                }     
            }
    pero me dice que decimal nunca es = null, eso no lo entiendo por que nu, si yo cuando execute el metodo y le pase los parametros apoco no le puede mandar aCadigo = null;??

    martes, 22 de mayo de 2012 15:27
  • pregunta, el escribir "asy" con y en lugar del i es por un tema en el teclado que usas?

    pero me dice que decimal nunca es = null,

    porque debes usar un

    decimal? variable = null;

    o sea debes poner el ? para definri un tipo nulo

    eso es lo que comente mas arriba cuando plantee el tema

    si defiens un  decimal simple no aplcia el nulable

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 22 de mayo de 2012 15:36
  • jajaja no, no es por el teclado es un mal habito pero ya no escribire asy si no así

    pero el detalle es que son parametros, de un metodo, no los debo definir en el metodo, por que el valor viene de otro lado.

    martes, 22 de mayo de 2012 16:01
  • pdorias definirlo

    public static List<MedicamentosEntity> Buscar(decimal? aCodigo, int? aIdCategoria, string aDescripcion)

    entonces cuando lo invocas si el parametro no aplcia usas

    es lo que comentaba cuando explique lo del

    int? valor = null; //aqui tomas un int que puede ser null sino tiene un valor numeri int temp=0; if(int.TryParse(textbox2.Text, out temp)){ valor = temp; }

    antes de invocar al Buscar() deberas decidir como enviar el filtro, pero es algo previo a la busqueda

    no puede pasar el valor del control de forma directa

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 22 de mayo de 2012 16:26
  • Hola Niquel,

    Te voy a hacer yo una pregunta, si te pongo este código como bien sabes por los ejemplos que muestras el resultado es 

    3,4,5,6,7,8,9

    var Lista = new List<int>()
                {
                    1,2,3,4,5,6,7,8,9
                };
    
                var resultado = from b in Lista
                              select b;
    
                resultado = resultado.Where(c => c != 1);
                resultado = resultado.Where(c => c != 2);
    
                foreach (var item in resultado)
                {
                    Console.Write(item);
                }

    Ahora imagina que te digo que obtengas de esa secuencia solo el valor 1 y 2, evidentemente tienes que aplicar un or no, como lo harías y no me vale que hagas esto.

    resultado = resultado.Where(c=> c==1 || c===2);

    Cuando resuelvas esto de la forma que muestras yo te diré cual es la respuesta, aunque ya te lo he dicho:)

    "Specification pattern"

    Saludos,


    phurtado
    Mi Blog Blog
    Sigueme en Twitter

    martes, 22 de mayo de 2012 17:07
    Moderador
  • si ya te entendi pedro de como hacer la consulta en linq con un or, creo que en mi caso es mejor un and &&, o los dos, y si entendi como aplicas el linq.

    y tambien lo que dice leandro en la capa de datos solo crea la consulta, pero la capa business validara que parametros le entraron

    esta es la clase de datos

    public static List<MedicamentosEntity> Buscar(decimal? aCodigo, int? aIdCategoria, string aDescripcion)
            {
                using (var context = new NombreDbDataContext(@"Data Source=SE0057D\sqlexpress;Initial Catalog=Enfermeria;Integrated Security=True"))
                {
                    var idMedicamentosQuery = from medic in context.Medicamentos
                                              select medic;
                    if (aCodigo != null)
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.Codigo == aCodigo);
    
                    if (aIdCategoria != null)
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.IdCategoria == aIdCategoria);
    
                    if (aDescripcion != "")
                        idMedicamentosQuery = idMedicamentosQuery.Where(medic => medic.Descripcion == aDescripcion);
                    return idMedicamentosQuery.ToList();
                }     
            }

    solo pregunta si es no es null pero no pregunta el tipo de dato si es correcto, por que eso se validara por esta otra clase

     public List<MedicamentosEntity> Buscar(decimal? aCodigo, int? idCategoria, string aDescripcion)
            {
                int valor = 0;
    
                if (aCodigo != null)
                {
                    if (decimal.TryParse(aCodigo, out valor))
                    {
                        
                    }
                }
    
            }
    solo que aqui me marca error de que aCodigo no es string, estoy teniendo problemas en la capa bisiness para validar si son del tipo correcto, no importa si son null, por que si es null quiere decir que no se quiso buscar por ese parametro, pero si no es null y tiene valor debe ser del valor correcto

    martes, 22 de mayo de 2012 17:46
  • solo pregunta si es no es null pero no pregunta el tipo de dato si es correcto, por que eso se validara por esta otra clase

    pero se supone que esto

                int valor = 0;
    
                if (aCodigo != null)
                {
                    if (decimal.TryParse(aCodigo, out valor))
                    {
                        
                    }
                }

    es previo a invocar al metodo Buscar(), no va dentro de la llamada, porque el parametro es nulable y recibe la info de un textbox o algun otro control

    se supone que lo que conviertes con ese codigo es el control para decidir que info asigans al parametro de Buscar() por eso va por fuera

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 22 de mayo de 2012 17:52
  • lo usas

    int? valor = null; int temp=0; if(int.TryParse(textbox2.Text, out temp)){ valor = temp; }

    Buscar(valor, ...);

    como veras usas el valor como parametro, pasandole un null si es que el textbox no tiene info que usar para filtrar o sino parsea al tipo correcto


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel martes, 22 de mayo de 2012 20:38
    martes, 22 de mayo de 2012 17:53
  • Hola Niquel,

    no solo de copiar código vive el hombre, en este caso el desarrollador. ¿En este código te has planteado que hay mal?¿No te dicen nada los errores del Visual Studio?

    public List<MedicamentosEntity> Buscar(decimal? aCodigo, int? idCategoria, string aDescripcion)
            {
                int valor = 0;
    
                if (aCodigo != null)
                {
                    if (decimal.TryParse(aCodigo, out valor))
                    {
                        
                    }
                }
    
            }

    Veamos, declaras una variable int (valor) y compruebas que aCodigo sea distinto de null. Hasta aquí todo bien, pero ahora haces esto

    http://msdn.microsoft.com/es-es/library/9zbda557.aspx

    Si miras el método veras que el primer parámetro debe ser un string y tu pasas un decimal? y el segundo debe ser un decimal (de salida) y tu pasas un int. Como verás, lo que tienes planteado falla por todos lados, así que, primero respira y luego mira que estás haciendo y sobre lee y entiende los errores que te da el Visual Studio.


    Atentamente, Sergio.

    Blog
    Twitter

    martes, 22 de mayo de 2012 17:57
  • aqui es donde me revuelvo un pokito, es que yo no he usado un textbox son parametros de un metodo, yo quiero validar al parametro no a la propiedad text de un textbox. es eso posible???

    asy no tendria que verlo desde aqui.

    en la presentacion en el evento click de un boton abra esto

    txtCodigo

    txtIdCategoria

    txtDescripciony aqui hacer loq ue medices leandro???.

    o en la clase business que puse???

    martes, 22 de mayo de 2012 18:00
  • les quiero agradecer a todos por las buenas respuestas y por tenerme tanta paciencia, deberas muchas gracias.

    a veces hasta yo mismo me sorprendo de las tonterias que digo jajajaja, como queria validar un tipo de dato que ya se envio en su tipo, nadamas a mi se me ocurre perod eberas muchas gracias ya esta terminado

    martes, 22 de mayo de 2012 20:20
  • tienes razon sergio, es que a veces son cosas simples que se hacer, pero me desespero todo por tonto, y las presiones de que ya quede y por que te tardas tanto y muchas presiones termino diciendo puras burradas deberas muchas gracias a todos por su paciencia
    martes, 22 de mayo de 2012 20:23
  • son parametros de un metodo

    si pero este metodo alguien lo invoca, si quein lo invoca quiere anular el parametro te pasara null, si quiere filtrar te pasara un valor, pero esto lo decides precio a invocar el Buscar()

    yo quiero validar al parametro no a la propiedad text de un textbox. es eso posible?

    es que no hace falta, no tienes que validar nada, solo tomas el valor y lo aplicas en el filtro

    en la presentacion en el evento click de un boton abra esto txtCodigo txtIdCategoria txtDescripciony aqui hacer loq ue medices leandro?

    claro en la presentacion es donde realzias el codigo que valida el input de la info y resuleve si toma el valor o asigna null

    o en la clase business que puse???

    pore clase business te refieres al Buscar() ? si es asi alli tomas los valores y aplcias el filtro verificanbdo si es null o no el valor para aplicar el filtro o no aplicarlo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 22 de mayo de 2012 20:34