One of the great new features coming to WCF vNext is the ability to expose a service through an IQueryable interface. This introduces the rich query model of OData to your own WCF services. How does this work?
Making the service queryable
On the server side, your service operation should return an IQueryable<T>. Annotate the operation with the new [QueryComposition] attribute. Once you do that, your service becomes queryable using the OData uri format.
1: [WebGet(UriTemplate = "")]
2: [QueryComposition]
3: public IQueryable<Customer> Get()
4: {
5: return customers.AsQueryable();
6: }
The Get method above returns an IQueryable of customers. With the query composition enabled, the host will now accept requests like “http://localhost/customers?$filter=Countrye%20eq%20Belgium” which says “find me all the customers from Belgium”.
Querying the service, LINQ to WCF
On the client side Microsoft added a CreateQuery<T> extension method which you can use with the new HttpClient to create a WebQuery<T>. Once you have that query, you can then apply a Where, or an Order by. Once you start to iterate through the result, we will automatically do a Get request to the server using the correct URI based on the filter. The results will come back properly ordered and filtered based on your query.
Below is a snippet that shows querying our previously created Customer resource:
1: public IEnumerable<Customer> GetBelgianCustomers()
2: {
3: var address = "http://localhost/customers";
4: var client = new HttpClient(address);
5: var customers = client.CreateQuery<Customer>();
6:
7: return customers
8: .Where(c=>c.Country == "Belgium")
9: .OrderBy(c=>c.CustomerName);
10: }