3.07.2010

Hacer una consulta con LinqToEntites que se comporte como un like en SQLServer

En estos días recibí una pregunta de parte de un alumno muy interesante: ¿Cómo hacer una consulta en LinqToEntites que se comporte como un like %parametro% en SQLServer. En este post voy a responder esta pregunta. En primera instancia vamos a usar una tabla que llamaremos participantes la cual vemos a continuación.

image

Seguidamente en la lógica de negocios vamos a hacer una consulta donde se nos devuelvan los registros en donde el nombre sea igual al que enviamos por parámetros o el nombre contenga el parámetro en alguna parte. La consulta es la siguiente:

public List<Participantes> ObtenerParticipantesPorNombre(Participantes participante)
{
var participantes = from p in entities.Participantes
where p.Nombre.IndexOf(participante.Nombre) > -1
select p;
return participantes.ToList();
}



Como se puede ver en la consulta, lo que hacemos en la condición where de la sentencia de LinqToEntities es aprovecharnos de los métodos de la clase string. En este caso utilizamos el método IndexOf el cual nos devuelve el índice de la primera ocurrencia positiva en la comparación de dos strings. Esto quiere decir que si el nombre que viene en la clase participante (una entidad del Entity Framework) hace match con alguna parte del nombre – ejemplo iego en Diego – nos va a retornar un valor superior a –1. Si lo que queremos es garantizarnos que el nombre debe iniciar con un string especifico, entonces utilizamos el método StartsWith como se muestra a continuación:



public List<Participantes> ObtenerParticipantesPorNombre(Participantes participante)
{
var participantes = from p in entities.Participantes
where p.Nombre.StartsWith(participante.Nombre)
select p;
return participantes.ToList();
}



La diferencia radica en que el método StartsWith devuelve verdadero si el string que estamos evaluando inicia con el string que estamos pasando por parámetro. Con estos dos métodos podemos tener un comportamiento similar al Like %parametro% de SQL.



Technorati Tags: ,

2 comentarios:

Anónimo dijo...

Hola.
Tambien podria servir el metodo Contains()

Luis D. Rojas dijo...

Hola que tal? Gracias por leer el blog y comentar. En realidad Contains serviría si estamos buscando que los string hagan match completos, osea que en TSQL seria algo como = variable y no como Like %variable%

Saludos