命名空间 (Entity SQL)
实体 SQL 引入命名空间以避免全局标识符(如类型名称、实体集、函数等)出现名称冲突。 实体 SQL 中的命名空间支持类似于 .NET Framework 中的命名空间支持。
实体 SQL 提供两种形式的 USING 子句:限定命名空间(其中,提供较短的别名以表示命名空间)和非限定命名空间,如下例所示:
USING System.Data;
USING tsql = System.Data;
名称解析规则
如果在本地作用域中无法解析标识符,实体 SQL 将尝试在全局作用域(命名空间)中找到此名称。 实体 SQL 首先尝试将标识符(前缀)与其中一个限定的命名空间匹配。 如果匹配,则实体 SQL 尝试在指定的命名空间中解析标识符的其余部分。 如果未找到匹配项,则将引发异常。
接下来,实体 SQL 尝试搜索所有非限定命名空间(在序言中指定)以查找该标识符。 如果只能在一个命名空间中找到此标识符,则返回该位置。 如果多个命名空间对于该标识符具有匹配项,则引发异常。 如果对于此标识符无法确定任何命名空间,则实体 SQL 将名称传递到下一个外部范围(DbCommand 或 DbConnection 对象),如下例中所示:
SELECT TREAT(p AS NamespaceName.Employee)
FROM ContainerName.Person AS p
WHERE p IS OF (NamespaceName.Employee)
.NET Framework 中的不同之处
在 .NET Framework 中,可以使用部分限定的命名空间。 实体 SQL 不允许这样做。
ADO.NET 使用
查询是通过 ADO.NET DbCommand 对象表示的。 可以在 DbCommand 对象之上构建 DbConnection 对象。 也可以将命名空间指定为 DbCommand 和 DbConnection 对象的一部分。 如果实体 SQL 无法在查询自身中解析标识符,则将探测外部命名空间(基于类似规则)。