Estoy intentando escribir una consulta SQL que filtra una vista de cuadrícula por los campos que se ingresan. Hay cuatro campos, título, nombre, apellido y Company.Name.Comprobación de consulta LINQ SQL si un campo de objeto no es nulo
Las tres primeras están bien, ya que nunca son nulas, pero la cuarta puede ser nula. La siguiente LINQ consulta funciona bien:
var listofclients = from client in allcients
where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower())
where client.Firstname.ToLower().Contains(firstnametxtbox.Text.Trim().ToLower())
where client.Surname.ToLower().Contains(surnametxtbox.Text.Trim().ToLower())
orderby client.Name
Pero cuando intento poner un filtro en él para la empresa en la que se producirá un error en tiempo de ejecución cuando la empresa es nulo
var listofclients = from client in allcients
where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower())
where client.Firstname.ToLower().Contains(firstnametxtbox.Text.Trim().ToLower())
where client.Surname.ToLower().Contains(surnametxtbox.Text.Trim().ToLower())
where client.Company.Name.ToLower().Contains(companynametxtbox.Text.Trim().ToLower())
orderby client.Name
lo que yo gustaría saber, ¿hay alguna forma de generar la consulta para que solo se filtre cuando el campo client.Company no sea nulo?
También soy vulnerable a la inyección de SQL o similar cuando lo saco directamente de los campos de cuadros de texto como este. Sé que en este caso no está conectado a la base de datos, pero si fuera así, podrían hacer una caída. O incluso si no está conectado a la base de datos, ¿podrían jugar con los objetos de la lista?
Gracias
Jon Hawkins
Eso hará el filtrado en el conjunto de datos recuperado. Me imagino que Jon quiere que el Nombre de la empresa se incluya como parte de la selección de SQL. – sipwiz
@sipwiz: No. Mientras no haya ToList() o un llamado equivalente en "de ... seleccionar", el objeto listofclient es un IQueryable (por lo que no se recuperan datos en este punto). Lo que significa que la solicitud aún no se ejecuta, por lo que la cláusula "where" se realizará ANTES de recuperar los datos. –
Sí exactamente cuando llamas a ToList o un método similar ocurre la invocación de sql real. – omoto