LINQ SQL查询检查对象字段是否不为null
我正在尝试编写一个SQL查询,根据输入的字段过滤gridview。有四个字段,标题、名字、姓氏和Company.Name 前三个很好,因为它们从不为空,但第四个可以为空。以下LINQ查询工作正常: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())
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!