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

LINQ SQL查询检查对象字段是否不为null,linq,Linq,我正在尝试编写一个SQL查询,根据输入的字段过滤gridview。有四个字段,标题、名字、姓氏和Company.Name 前三个很好,因为它们从不为空,但第四个可以为空。以下LINQ查询工作正常: var listofclients = from client in allcients where client.Title.ToLower().Contains(titletxtbox.Text.Trim().ToLower())

我正在尝试编写一个SQL查询,根据输入的字段过滤gridview。有四个字段,标题、名字、姓氏和Company.Name

前三个很好,因为它们从不为空,但第四个可以为空。以下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注入之类的攻击。我知道在这种情况下,它没有连接到数据库,但如果是,他们可以做一个下降。或者,即使它没有连接到数据库,他们是否可以摆弄列表中的对象

谢谢

乔恩·霍金斯

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))

类似这样的内容

1)Linq to Sql在其查询中使用参数,因此不易受到Sql注入的攻击。但是,永远不要相信用户输入

2) 对不起,Linq不提供免费的空值检查。您可以通过一个简单的扩展方法tho来实现这一点,以保持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;
  }
}

我假设您想要所有匹配的记录,其中公司为空,但在公司存在时按名称过滤。以下内容应该可以做到这一点。此外,您不必担心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

这将对检索到的数据集进行过滤。我想Jon希望将公司名称作为SQL select的一部分包括在内。@sipwiz:不。只要“from…select”上没有调用ToList()或等效项,对象listofclient就是一个IQueryable(因此此时没有检索到数据)。这意味着请求仍然没有执行,因此在检索数据之前将执行“where”子句。是的,只有当您调用ToList或类似的方法时,才会发生真正的sql调用。dangit!我讨厌编辑代码来让它变得更好,只是为了引入一个bug!