Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/01/2011, 04:43
daimroc
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 17 años, 6 meses
Puntos: 0
Cómo establecer la consulta condicionalmente

Bueno, el título no dice mucho pero lo explico.

En muchas ocasiones, la consulta que se quiere hacer no se sabe de antemano, ya que depende de lo que el usuario haya seleccionado en los controles del formulario.

Por ejemplo tengo un caso simple. Se tienen dos campos para una tabla personas. El primer campo es el DNI con el que se identifica de forma única a la persona. El segundo campo es el Nombre.

Se quiere que si se introduce el DNI se busque a la persona, independientemente de lo que se ha puesto en el campo del nombre. En caso de que no se haya puesto el DNI, que busque todas las personas cuyo nombre sea el que se ha puesto en el campo del nombre.

En ADO, dado que la sentencia SQL se pasa como un string, yo podría hacer lo siguiente:

string miSQL = "select * from personas where";

if(txtDNI.Text != "")
{
miSQL = miSQL + " DNI = txtDNI.Text"
}

else
{
miSQL = miSQL + "nombre = txtNombre.Text"
}

Ya tengo el string con la sentencia SQL.

Además, esta forma permite concatenar más condicines en el where de forma sencilla. Por ejemplo, si hay un campo fecha de naciemiento, fácilmente se puede comprobar si el TextBox tiene datos o no, y concatenar " and fechaNacimiento>XXXX". Quedaría del modo siguiente:

if(txtDNI.Text != "")
{
miSQL = miSQL + " DNI = txtDNI.Text";
}

else
{
miSQL = miSQL + "nombre = txtNombre.Text";

if(txtFechaNacimiento != "")
{
miSQL = miSQL + " and FechaNacimiento = txtFechaNacimiento";
}

.... el resto de if()
}


Es decir, no hace falta que contemple todas las posibles combinaciones de condiciones que se pueden utilizar.

Sin embargo, la forma de construir la consulta en LinQ es la siguiente:

var misPersonas = (from p in miDB.Personas
where DNI = txtDNI.Text
select p)

Como se ve, aquí no existe la posiblidad de hacerlo com antes indiqué, solo veo que se tiene que poner a mano los campos que intervienen en el where, lo que obliga a contemplar todas las posibles combinaciones de campos que pueden intervenir en el where, lo cual es algo inviable a pocos campos que se puedan utilizar.

¿Realmente esto es así o hay alguna forma de hacerlo? ¿Cómo haría en LinQ lo que hice con ADO?.



Muchas gracias.
Daimroc.