What Is WCF Data Services
WCF Data Services (originally shipped as ADO.NET Data Services, codenamed 'Astoria') is a framework built on top of WCF's REST plumbing that automatically exposes an OData feed from a data source — typically an Entity Framework DbContext or ObjectContext, though any IQueryable-based provider works. You create it by deriving a class from DataService<T>, where T is your context type, and the framework handles translating incoming OData-formatted HTTP requests into LINQ queries against that context without you writing per-entity controller actions.
Cricket analogy: DataService<T> automatically generating a queryable feed from your entity model is like a stadium's automated scoreboard system that pulls directly from the official scoring database and publishes it live, without a human manually typing every run onto a physical board.
Exposing and Querying an OData Feed
Inside the overridden InitializeService method, config.SetEntitySetAccessRule("*", EntitySetRights.AllRead) (or a more restrictive rule per entity set) controls which entity sets are exposed and which HTTP verbs are permitted against them. Once configured, clients query the feed using standard OData URI conventions — for example, /Products?$filter=Price gt 10&$orderby=Name&$top=5&$expand=Category — and WCF Data Services translates that query string automatically into the equivalent LINQ-to-Entities expression executed against the underlying DbContext, without any custom query-handling code.
Cricket analogy: Applying an OData $filter clause is like a broadcaster's stats system letting a commentator type 'show me all sixes hit off spin bowling after the 40th over' and getting an instant filtered result, without a producer manually combing through footage.
Service Operations and Interceptors
Beyond the auto-exposed CRUD-over-entity-sets behavior, WCF Data Services supports custom [WebGet] Service Operations for query-like read methods that don't map cleanly to a single entity set, and WebInvoke-style Service Actions for side-effecting operations such as a custom 'ApplyDiscount' endpoint. QueryInterceptor attributes let you inject an expression that filters every query against an entity set — useful for row-level security, such as only returning orders belonging to the current authenticated user — while ChangeInterceptor attributes run validation or auditing logic before an insert, update, or delete is committed to the store, letting you reject or log a change before it happens.
Cricket analogy: A QueryInterceptor silently filtering every query to only the current user's data is like a scorer's private notebook that automatically only ever shows the querying team's own statistics, no matter what broad question is asked of it, hiding the opposition's data by default.
Positioning Relative to Modern Alternatives
WCF Data Services was effectively superseded for new development by dedicated OData libraries such as Microsoft.AspNetCore.OData, which brings the same $filter/$expand/$orderby query semantics into the ASP.NET Core pipeline with modern middleware and dependency injection support. Today, WCF Data Services is mostly encountered while maintaining older line-of-business applications that directly exposed an Entity Framework model as an OData feed for internal reporting or Excel/Power BI integration; teams modernizing such systems typically migrate to ASP.NET Core OData if they still need the $filter/$expand query surface, or to a purpose-built REST or GraphQL API if free-form OData querying is no longer a requirement.
Cricket analogy: WCF Data Services being superseded by ASP.NET Core OData is like a ground's old manual hand-operated scoreboard being replaced by a modern digital Hawk-Eye-integrated display — the same core job of showing scores continues, but on a fundamentally more current platform.
public class StoreDataService : DataService<StoreContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("Products", EntitySetRights.AllRead);
config.SetEntitySetAccessRule("Orders", EntitySetRights.ReadSingle | EntitySetRights.WriteMerge);
config.DataServiceBehavior.MaxProtocolVersion = ODataProtocolVersion.V3;
}
[QueryInterceptor("Orders")]
public Expression<Func<Order, bool>> OnlyOwnOrders()
{
var currentUserId = HttpContext.Current.User.Identity.Name;
return order => order.CustomerId == currentUserId;
}
[ChangeInterceptor("Orders")]
public void OnOrderChanging(Order order, UpdateOperations operation)
{
if (operation == UpdateOperations.Delete && order.Status == "Shipped")
throw new DataServiceException(409, "Cannot delete a shipped order.");
}
}
// Client query: GET /StoreDataService.svc/Products?$filter=Price gt 10&$orderby=Name&$top=5&$expand=CategoryCommon OData query options supported by WCF Data Services include $filter (row filtering), $orderby (sorting), $top and $skip (paging), $expand (eager-loading related entities), and $select (projecting specific properties) — all translated automatically into LINQ-to-Entities without custom query code.
- WCF Data Services exposes an Entity Framework context as a queryable OData feed by deriving from DataService<T>.
- InitializeService and SetEntitySetAccessRule control which entity sets and verbs are exposed.
- OData query strings ($filter, $orderby, $top, $expand) are translated automatically into LINQ-to-Entities.
- Service Operations and Service Actions handle custom logic that doesn't map to plain entity-set CRUD.
- QueryInterceptor attributes enforce row-level filtering, such as restricting results to the current user.
- ChangeInterceptor attributes validate or audit inserts, updates, and deletes before they commit.
- New development favors ASP.NET Core OData or a purpose-built REST/GraphQL API over WCF Data Services.
Practice what you learned
1. What base class does a WCF Data Services service derive from?
2. Which method controls which entity sets are exposed and what access rights apply?
3. What does a QueryInterceptor attribute do?
4. Which OData query option is used to eagerly include related entities in the response?
5. What is generally recommended for new development instead of WCF Data Services?
Was this page helpful?
You May Also Like
RESTful Services with WCF
Shows how to expose plain REST/JSON endpoints from a WCF service using webHttpBinding, WebGet/WebInvoke, and UriTemplate routing.
WCF vs Web API
Compares WCF's protocol-flexible, contract-first model against ASP.NET Web API's HTTP-first, resource-oriented approach, and when to choose each.
Related Reading
Related Study Notes in Microsoft Technologies
Browse all study notesWindows 10 / UWP Development Study Notes
.NET · 30 topics
Microsoft TechnologiesWindows Batch Scripting Study Notes
Batch · 30 topics
Microsoft TechnologiesMFC (Microsoft Foundation Classes) Study Notes
C++ · 30 topics
Microsoft TechnologiesSilverlight Study Notes
.NET · 30 topics
Microsoft TechnologiesXAML Study Notes
.NET · 30 topics
Microsoft TechnologiesWPF (Windows Presentation Foundation) Study Notes
.NET · 30 topics