2
 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 });

按预期工作。但是,如果没有ToArray(),我会得到看起来很奇怪的行为:null firstName导致标签被评估为null。随着ToArray()我得到预期的行为。(null 被视为空字符串并连接到其他非空字符串)。为什么?

4

2 回答 2

7

在 SQL 世界中,根据定义,任何包含 NULL 作为其一部分的表达式都将变为 NULL。这是因为 NULL 意味着一个不确定的值 - 一个不确定的值 + 其他任何东西仍然是一个不确定的值,即 NULL。

同样,在 SQL 中,您可以使用 COALESCE 之类的东西将 NULL 转换为例如空白字符串——我不记得 linq 等价物是什么。

于 2012-06-08T00:20:35.520 回答
1

使用 .ToArray(),您可以针对 .NET 类型使用 Linq,该类型在代码中进行评估并使用 .NET 类型处理。在这里,字符串连接方法按照您习惯的方式工作。

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

在这种情况下,DBMS 被配置为根据 ANSI 标准处理 NULL,这在某些方面与 .NET 非常不同。您应该查找 ANSI NULL 以了解详细信息。它并不复杂,但如果你不期待它可能会令人困惑。

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

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

于 2012-06-08T00:24:56.210 回答