资源路径规则和语义(ADO.NET 数据服务框架)

本文档介绍了可使用 ADO.NET 数据服务资源路径规则和语义构建的各种路径。还说明了特定于资源路径的某个特定元素的任何约束。

规则

下列规则适用于资源路径中的任何段:

  • 如果实体集未在默认实体容器中,则必须使用下列语法构建地址:/ServiceName/<EntityContainer>/<EntitySet>. 如果将多个段组成一个路径,并且此路径将同一容器中的某个实体集标识为路径中注明的第一个实体集,则此集的前面不需要带有容器名称。

  • 复合键谓词中的键顺序很重要。客户端必须按照复合键中的键值在数据服务的概念架构定义语言 (CSDL) 描述中列出的顺序组织这些键值。有关更多信息,请参见概念架构 (CSDL)

  • 在以下段后不允许有其他路径段:/$links/<segment>。例如:在以下 URI 中的 'BestFriend' 后不能出现路径段:http://host/service.svc/Person(1)/$links/BestFriend. 若存在任何其他路径段,则会导致出现响应“400 错误的请求”。

  • 在针对使用 $links 对链接进行寻址的 URI 的任何请求中,不允许任何以 $ 开始的查询选项,例如 $filter。若存在此类查询选项,则会导致出现响应“400 错误的请求”。注意:任何不以 $ 开始的 ADO.NET 查询选项均无效。

  • 对于使用下列语法的所有情况,可以将链接属性替换为导航属性

  • 对于使用下列语法的所有情况,可以将路径段中出现的第一个实体集替换为一个服务操作

语义

下面的 URI 语法类型列表中指定了适用于 ADO.NET 数据服务 URI 基集的语义。可以组合这些基础示例以构建更长的 URI。每个 URI 示例的后面均提供了等效的 LINQ 语法。

URI:serviceName/<entity set>

此语法表示指定实体集内的某个实体类型的所有实例。此实体集可能具有 0 个、1 个或多个实体类型实例。

示例:

此示例获取 Customers 实体集中的所有客户:

https://www.contoso.com/dataservice.svc/Customers

等效的 LINQ 语法:

from c in Customers 
select c

URI:serviceName/<entity set>(keyPredicate)

此语法表示一个实体类型实例,该实例的键与键谓词相同且位于指定实体集中。

示例:

此示例获取由键 ALFKI 标识的客户:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')

等效的 LINQ 语法:

(from c in Customers
where c.keyProperty == "ALFKI"
select c).First()

URI:serviceName/<entity set>(keyPredicate)/<Complex Type>

此语法表示指定实体类型上的复杂类型实例,该实例的键与键谓词相同且位于指定实体集中。

示例:

此示例获取由 Customers 实体集中的键 ALFKI 标识的客户的地址:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address

等效的 LINQ 语法:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.ComplexType).First()

URI:ServiceName/<entity set>(KeyPredicate)/<Complex Type>/<Property>

此语法表示实体类型实例内的复杂类型上的属性,该实例的键与键谓词相同且位于指定实体集中。

可为以某个属性结束的 URI 追加一个 /$value 段。$value 段可用作取消引用运算符,并指示只应返回属性的值,而不返回其他元数据或环绕语法。

示例:

此示例获取由 Customers 实体集中的键 ALFKI 标识的客户的地址:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address/Name

此示例与上一个实例相同,只不过它表示属性的值,而不带任何环绕元数据。例如,如果 URI 指定了 .jpg 图像,则可以直接将此 URI 包含在 IMG HTML 标记中作为 SRC 属性的值:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Address/Name/$value

等效的 LINQ 语法:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.ComplexType.Property).First()

URI:serviceName/<entity set>(KeyPredicate)/<Property>

此语法表示实体类型实例的属性,该实例的键与键谓词相同且位于指定实体集中。

可为以某个属性结束的 URI 追加一个 /$value 段。$value 可用作取消引用运算符,并指示只应返回属性的值,而不返回其他元数据或环绕语法。

示例:

此示例获取由 Customers 实体集中的键 ALFKI 标识的客户的名称:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/CustomerName

此示例与上一个实例相同,只不过它表示属性的值,而不带任何环绕元数据。例如,如果 URI 指定了 .jpg 图像,则可以直接将此 URI 包含在 IMG HTML 标记中作为 SRC 属性的值:

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/CustomerName/$value

等效的 LINQ 语法:

(from c in Customers
where c.keyProperty == "ALFKI"
select c.Property).First()

URI:serviceName/<entity set>(KeyPredicate)/<NavigationProperty>

此语法表示一个实体集,该实体集包含某个实体类型的零到多个实例的集合。此实体集将仅包含与前一个路径段中的实体类型实例关联的实例。

示例:

此示例获取由键 ALFKI 标识的 Customer 的所有 Orders

https://www.contoso.com/dataservice.svc/Customers('ALFKI')/Orders

等效的 LINQ 语法:

from c in Customers
from c2 in c.RelatedEntitySet 
where c.keyProperty == "ALFKI"
select c2

替代 LINQ 语法:

Db.Customers.Where(c => p.keyProperty.Equals("ALFKI")).SelectMany(c => c.RelatedEntitySet);

另请参见

概念

通用 HTTP 要求(ADO.NET 数据服务框架)