我正在尝试编写一个SQL查询,根据输入的字段筛选gridview.有四个字段,title,firstname,surname和Company.Name.
前三个很好,因为它们永远不会为null,但第四个可以为null.以下LINQ查询工作正常:
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
但是当我尝试为公司设置一个过滤器时,当公司为空时,我将在运行时收到错误
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
我想知道的是,是否有一种方法来构建查询,以便它只在client.Company字段不为null时进行过滤.
当我直接从像这样的文本框字段中提取时,我也容易受到SQL注入等的攻击.我知道在这种情况下它没有连接到数据库,但如果它可以,它们可以做一个下降.或者即使它没有连接到数据库,他们可以摆弄列表中的对象吗?
谢谢
乔恩霍金斯
我假设您想要所有匹配的记录,其中公司为空,但在公司存在时按名称过滤.以下应该这样做.此外,您不必担心SQL注入,因为LINQToSQL使用参数化查询.如果您打算从中进行插入并在Web上显示任何值以避免XSS攻击,则必须担心清除客户端控件中可能存在的任何HTML.
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 == null || client.Company.Name.ToLower().Contains(companynametxtbox.Text.Trim().ToLower()) orderby client.Name