有人可以向我解释为什么这两者在功能上有所不同吗?
第一个在我的样本数据上返回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;
}
答案 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,这将无法通过您的相等测试。
在代码中,字符串将始终为空,然后将起作用。