Accessing Data Service Resources (WCF Data Services)
WCF Data Services supports the Open Data Protocol (OData) to expose your data as a feed with resources that are addressable by URIs. These resources are represented according to the entity-relationship conventions of the Entity Data Model. In this model, entities represent operational units of data that are data types in an application domain, such as customers, orders, items, and products. Entity data is accessed and changed by using the semantics of representational state transfer (REST), specifically the standard HTTP verbs of GET, PUT, POST, and DELETE.
Addressing Resources
In OData, you address any data exposed by the data model by using a URI. For example, the following URI returns a feed that is the Customers entity set, which contains entries for all instances of the Customer entity type:
http://services.odata.org/Northwind/Northwind.svc/Customers
Entities have special properties called entity keys. An entity key is used to uniquely identify a single entity in an entity set. This enables you to address a specific instance of an entity type in the entity set. For example, the following URI returns an entry for a specific instance of the Customer entity type that has a key value of ALFKI
:
http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')
Primitive and complex properties of an entity instance can also be individually addressed. For example, the following URI returns an XML element that contains the ContactName
property value for a specific Customer:
http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/ContactName
When you include the $value endpoint in the previous URI, only the value of the primitive property is returned in the response message. The following example returns only the string "Maria Anders" without the XML element:
http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/ContactName/$value
Relationships between entities are defined in the data model by associations. These associations enable you to address related entities by using navigation properties of an entity instance. A navigation property can return either a single related entity, in the case of a many-to-one relationship, or a set of related entities, in the case of a one-to-many relationship. For example, the following URI returns a feed that is the set of all the Orders that are related to a specific Customer:
http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders
Relationships, which are usually bi-directional, are represented by a pair of navigation properties. As the reverse of the relationship shown in the previous example, the following URI returns a reference to the Customer entity to which a specific Order entity belongs:
http://services.odata.org/Northwind/Northwind.svc/Orders(10643)/Customer
OData also enables you to address resources based on the results of query expressions. This makes it possible to filter sets of resources based on an evaluated expression. For example, the following URI filters the resources to return only the Orders for the specified Customer that have shipped since September 22, 1997:
http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders?$filter=ShippedDate gt datetime'1997-09-22T00:00:00'
For more information, see OData: URI Conventions.
System Query Options
OData defines a set of system query options that you can use to perform traditional query operations against resources, such as filtering, sorting, and paging. For example, the following URI returns the set of all the Order
entities, along with related Order_Detail
entities, the postal codes of which do not end in 100
:
http://services.odata.org/Northwind/Northwind.svc/Orders?$filter=not endswith(ShipPostalCode,'100')&$expand=Order_Details&$orderby=ShipCity
The entries in the returned feed are also ordered by the value of the ShipCity property of the orders.
WCF Data Services supports the following OData system query options:
Query Option | Description |
---|---|
$orderby |
Defines a default sort order for entities in the returned feed. The following query orders the returned customers feed by county and city:
For more information, see OData: OrderBy System Query Option ($orderby). |
$top |
Specifies the number of entities to include in the returned feed. The following example skips the first 10 customers and then returns the next 10:
For more information, see OData: Top System Query Option ($top). |
$skip |
Specifies the number of entities to skip before starting to return entities in the feed. The following example skips the first 10 customers and then returns the next 10:
For more information, see OData: Skip System Query Option ($skip). |
$filter |
Defines an expression that filters the entities returned in the feed based on specific criteria. This query option supports a set of logical comparison operators, arithmetic operators, and predefined query functions that are used to evaluate the filter expression. The following example returns all orders the postal codes of which do not end in 100:
For more information, see OData: Filter System Query Option ($filter). |
$expand |
Specifies which related entities are returned by the query. Related entities are included as either a feed or an entry inline with the entity returned by the query. The following example returns the order for the customer 'ALFKI' along with the item details for each order:
For more information, see OData: Expand System Query Option ($expand). |
$select |
Specifies a projection that defines the properties of the entity are returned in the projection. By default, all properties of an entity are returned in a feed. The following query returns only three properties of the
For more information, see OData: Select System Query Option ($select). |
$inlinecount |
Requests that a count of the number of entities returned in the feed be included with the feed. For more information, see OData: Inlinecount System Query Option ($inlinecount). |
Addressing Relationships
In addition to addressing entity sets and entity instances, OData also enables you to address the associations that represent relationships between entities. This functionality is required to be able to create or change a relationship between two entity instances, such as the shipper that is related to a given order in the Northwind sample database. OData supports a $link operator to specifically address the associations between entities. For example, the following URI is specified in an HTTP PUT request message to change the shipper for the specified order to a new shipper.
http://services.odata.org/Northwind/Northwind.svc/Orders(10643)/$links/Shipper
For more information, see OData: Addressing Links between Entries.
Consuming the Returned Feed
The URI of an OData resource enables you to address entity data exposed by the service. When you enter a URI into the address field of a Web browser, a OData feed representation of the requested resource is returned. For more information, see the WCF Data Services Quickstart. Although a Web browser may be useful for testing that a data service resource returns the expected data, production data services that can also create, update, and delete data are generally accessed by application code or scripting languages in a Web page. For more information, see Using a Data Service in a Client Application (WCF Data Services).