C# 为什么连接到非空字符串的空字符串的计算结果为空?

C# 为什么连接到非空字符串的空字符串的计算结果为空?,c#,.net,linq,linq-to-entities,C#,.net,Linq,Linq To Entities,一切正常。但是,如果没有ToArray(),我会得到一种奇怪的行为:一个nullfirstName会导致标签被评估为null。使用ToArray()我获得了预期的行为。(null被视为空字符串,并连接到其他非空字符串)。为什么?在SQL世界中,根据定义,任何包含NULL的表达式都将变为NULL。这是因为NULL表示不确定值-不确定值+任何其他值仍然是不确定值,即NULL 同样,在SQL中,您可以使用类似COALESCE的东西将null转换为(比如)空白字符串—我现在还不记得linq等价物是什么。

一切正常。但是,如果没有
ToArray()
,我会得到一种奇怪的行为:一个
null
firstName
会导致标签被评估为
null
。使用
ToArray()
我获得了预期的行为。(null被视为空字符串,并连接到其他非空字符串)。为什么?

在SQL世界中,根据定义,任何包含NULL的表达式都将变为NULL。这是因为NULL表示不确定值-不确定值+任何其他值仍然是不确定值,即NULL

同样,在SQL中,您可以使用类似COALESCE的东西将null转换为(比如)空白字符串—我现在还不记得linq等价物是什么。

对于.ToArray(),您使用的是针对.NET类型的linq,该类型在代码中计算并使用.NET类型处理。这里,字符串连接方法的工作方式与您习惯的相同

如果没有.ToArray,您的查询将在DBMS中执行,并使用该系统配置为用于空值的任何内容

在这种情况下,DBMS被配置为根据ANSI标准处理空值,这在某些地方与.NET非常不同。您应该查找ANSI NULL以了解详细信息。这并不复杂,但如果你没有预料到的话,可能会让人困惑

两个附录 1) 首先,我相信空值的连接规则是在ANSI标准中规定的,但实际上我意识到我可能错了。我来自SQL Server背景,其中ANSI_NULLS是一个控制空相等的设置,而连接由另一个设置控制。如果我错误地将后者与前者联系起来,我道歉

2) 尽管我谈到了可配置性,而且SQL Server至少允许更改该配置,但您看到的行为绝对是标准的、默认的和预期的。如果你将经常使用数据库,你应该习惯它。

空合并操作符
,将是C#/Linq的等价物。
 var users=db.Users.Where(u => u.Name.StartsWith(term) || u.Email.StartsWith(term) || u.FirstName.StartsWith(term)).ToArray();
 var jsos=users.Select(u => new { label = u.FirstName  +" "+  u.Name+ " (" + u.Email+")", value = u.Id });