Linq to SQL查询未返回预期结果

时间:2011-01-19 08:30:16

标签: c# linq-to-sql lambda

有人可以向我解释为什么这两者在功能上有所不同吗?

第一个在我的样本数据上返回null,第二个返回预期的结果。我把+ @""部分放在一边,以避免在空字符串上调用replace。

代码始终在我的示例数据上返回null:

to_follows_contact = db.CONTACTs.Where(n =>
    n.ACCOUNTID == account.ACCOUNTID
    && (
        (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                                                            == @"TOFOLLOW"
        ||
        (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"").Replace(@" ", @"") 
                                                            == @"FOLLOWTO"
    )
).FirstOrDefault();

代码在我的示例数据上返回正确的联系人:

foreach (CONTACT n in db.CONTACTs.Where(n => n.ACCOUNTID == account.ACCOUNTID))
{
    string ContactName = (n.FIRSTNAME + n.MIDDLENAME + n.LASTNAME + @"")
                         .Replace(@" ", @"");
    if (ContactName == @"TOFOLLOW" || ContactName == @"FOLLOWTO")
        to_follows_contact = n;
}

2 个答案:

答案 0 :(得分:5)

正在发生的事情是,第一个代码示例实际上完全在T-SQL中解决了问题。不幸的是,从C#到SQL的转换并不完全透明。

SQL以不同的方式处理来自.NET的空值。 SELECT 'Foo' + NULL + 'Bar'将返回NULL。你需要使用COALESCE或类似的东西。在LINQ to SQL中,转换为:

(n.FIRSTNAME ?? "" + n.MIDDLENAME ?? "" + n.LASTNAME ?? "").Replace(" ", "")

如果您使用它,它应该可以正常工作。

如果您有兴趣,可以使用db.GetCommand(IQueryable<T>)来获取生成的SQL语句。当您在调试时将鼠标悬停在一段源代码中的IQueryable变量上时,它也可用。

*:这实际上取决于您可以设置的某些数据库选项,但这是默认行为。

答案 1 :(得分:1)

猜测,生成的SQL将连接各种字符串,但是,如果其中一个为null,那么您将始终从连接中返回NULL,这将无法通过您的相等测试。

在代码中,字符串将始终为空,然后将起作用。