我正在尝试编写一个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注入等攻击。我知道在这种情况下它没有连接到数据库,但如果它可以,他们可以做一个下降。或者即使它没有连接到数据库,他们也可以摆弄列表中的对象吗?
由于
乔恩霍金斯答案 0 :(得分:5)
我假设您想要所有匹配的记录,其中公司为空,但在公司存在时按名称过滤。以下应该这样做。此外,您不必担心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
答案 1 :(得分:3)
var listofclients = from client in allcients
orderby client.Name
select client;
if (string.IsNullOrEmpty(titletxtbox.Text))
listofclients = listofclients.Where(l=>l.Title.Contains(titletxtbox.Text))
........
像这样的东西
答案 2 :(得分:1)
1)Linq to Sql在其查询中使用参数,因此它不容易受到sql注入的影响。但是,永远不要信任用户输入。
2)Linq没有提供免费的空检查,抱歉。您可以使用一个简单的扩展方法来完成此操作,以保持您的linq查询修剪和适合:
public static class StringExtensions
{
public static bool ContainsEx(this string me, string other)
{
if(me == null || other == null) return false;
// This is a better way of performing a case-insensitive Contains
return me.IndexOf(other, 0, StringComparison.OrdinalIgnoreCase) != -1;
}
}