2009-04-13 541 views
8

我正在尝试编写一个SQL查询,通过输入的字段过滤gridview。有四个字段,标题,名字,姓氏和Company.Name。LINQ SQL查询检查对象字段是否为空

前三个很好,因为它们从不为空,但第四个可以为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字段不为空时进行过滤。

我也很容易SQL注入或类似的东西,当我直接从这样的文本框领域拉。我知道在这种情况下,它没有连接到数据库,但如果它可以做一个下降。或者,即使它没有连接到数据库,他们可以摆弄列表中的对象吗?

感谢

乔恩·霍金斯

回答

5

我假设你想所有匹配的记录,其中公司为空,但是当公司存在按名称过滤。以下应该做到这一点。另外,由于LINQToSQL使用参数化查询,因此您无需担心SQL注入。如果您打算从其中插入并在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 
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)) 

........

像这样的事情

+0

虽然会对检索到的数据集进行过滤。我想像Jon希望将公司名称作为SQL选择的一部分。 – sipwiz 2009-04-13 11:44:53

+0

@sipwiz:否。只要没有ToList()或在“from ... select”上调用等价物,对象listofclient就是IQueryable(因此此时不检索数据)。这意味着请求仍未执行,因此在检索数据之前将执行“where”子句。 – 2010-03-12 09:48:18

1

1)LINQ到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; 
    } 
}