实体 SQL 引入了命名空间,以避免全局标识符的名称冲突,例如类型名称、实体集、函数等。 Entity SQL 中的命名空间支持类似于 .NET Framework 中的命名空间支持。
实体 SQL 提供两种形式的 USING 子句:限定的命名空间(其中为命名空间提供了较短的别名),以及未限定的命名空间,如以下示例所示:
USING System.Data;
USING tsql = System.Data;
名称解析规则
如果无法在本地作用域中解析标识符,Entity SQL 会尝试在全局范围(命名空间)中找到名称。 实体 SQL 首先尝试将标识符(前缀)与某个限定的命名空间匹配。 如果存在匹配项,Entity SQL 将尝试解析指定命名空间中标识符的其余部分。 如果未找到匹配项,则会引发异常。
接下来,Entity SQL 尝试搜索标识符的所有未限定命名空间(在 prolog 中指定)。 如果标识符正好位于一个命名空间中,则返回该位置。 如果多个命名空间与该标识符匹配,则会引发异常。 如果无法为标识符标识命名空间,Entity 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 。 命名空间也可以指定为对象的DbConnection一部分DbCommand。 如果实体 SQL 无法解析查询本身中的标识符,将探测外部命名空间(基于类似的规则)。