LINQ SQL查询检查对象字段是否为空

时间:2009-04-13 11:35:29

标签: linq

我正在尝试编写一个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注入等攻击。我知道在这种情况下它没有连接到数据库,但如果它可以,他们可以做一个下降。或者即使它没有连接到数据库,他们也可以摆弄列表中的对象吗?

由于

乔恩霍金斯

3 个答案:

答案 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;
  }
}