2011-03-24 39 views
6

Tengo una consulta que tiene este aspecto:Cómo utilizar comodines SQL en LINQ a Entity Framework

IQueryable<Profile> profiles = from p in connection.Profiles 
    where profile.Email.Contains(txtSearch) 
    select p; 

Yo sé que cuando esto se convierte a SQL que utiliza una LIKE '%<value of txtSearch>%' pero si txtSearch = "jon%gmail.com" se convierte en ` LIKE '% jon ~% gmail.com%'. El ~ escapa del% en el medio que es un comodín. ¿Cómo puedo evitar eso? Necesito poder poner comodines en mis búsquedas de LINQ to EF.

Respuesta

2

No estoy seguro de que esto sea posible directamente con linq porque puede llamar solo a funciones básicas de cadena como Contains, StartsWith o EndsWith. It is possible with Entity SQL para que pueda combinar estos enfoques.

var query = new ObjectQuery<Profile>(
    @"SELECT VALUE p 
     FROM CsdlContainerName.Profiles AS p 
     WHERE p.Email LIKE '" + wildcardSearch + "'", 
    context); 

var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList(); 

ataques de inyección de ESQL volver :)

Segunda versión sin vulnerabilidad de inyección (que no lo probé pero debería funcionar):

var commandText = 
    @"SELECT VALUE p 
     FROM CsdlContainerName.Profiles AS p 
     WHERE p.Email LIKE @search"; 

var query = new ObjectQuery<Profile>(commandText, context); 
query.Parameters.Add(new ObjectParameter("search", wildcardSearch)); 

var result = query.AsQueryable().OrderByDescending(p => p.Name).ToList(); 
+0

La página que estoy creando es una página de administración así que no estoy preocupado por un ataque de inyección SQL, pero ¿el método anterior no me abriría a un ataque de inyección SQL? –

+0

Creo que sí, pero en realidad no lo intenté (ver mi comentario debajo del fragmento de código). Pero también puede usar la versión con parámetros: la agregaré como segundo ejemplo. –

Cuestiones relacionadas