About the author

Brian Keating is a developer addicted to Microsoft Technologies.

Month List

RecentComments

Comment RSS

ASP WebApi query single entity

clock April 9, 2012 20:26 by author Brian Keating |

 

What’s wrong with this?

 

   1:  public class UsersController : RavenController
   2:  {  
   3:      public User Get(int userId)
   4:      {
   5:          this.AutoSave = false;
   6:          var user = RavenSession.Load<User>(userId);
   7:          if (user == null)
   8:             throw new HttpResponseException("Unable to find user for it " + userId);
   9:          return user;
  10:      }
  11:   
  12:      // GET /api/values
  13:      public IQueryable<User> GetAll()
  14:      {
  15:          this.AutoSave = false;
  16:          return RavenSession.Query<User>();            
  17:      }        
  18:  }

The problem is the variable name used for getting a single user the function would never be called.

E.g. if we put http://localhost:65487/api/users/1 into our browser what will happen is the GetAll gets called!

What we need to call is

   1:  public class UsersController : RavenController
   2:  {  
   3:      public User Get(int id)
   4:      {
   5:          this.AutoSave = false;
   6:          var user = RavenSession.Load<User>(id);
   7:          if (user == null)
   8:              throw new HttpResponseException("Unable to find user for it " + id);
   9:          return user;
  10:      }
  11:   
  12:      // GET /api/values
  13:      public IQueryable<User> GetAll()
  14:      {
  15:          this.AutoSave = false;
  16:          return RavenSession.Query<User>();            
  17:      }        
  18:  }

Now you see that the Get takes a variable name of “id” this is key to getting this work.

 

Note: I’m using IQuerable as this allows me to add some query parameters to my request, e.g.

$filter
A Boolean expression for whether a particular entry should be included in the feed, e.g. Categories?$filter=CategoryName eq 'Produce'. The Query Expression section describes OData expressions.

$orderby
One or more comma-separated expressions with an optional “asc” (the default) or “desc” depending on the order you’d like the values sorted, e.g. Categories?$orderby=CategoryName desc.

$select
Limit the properties on each entry to just those requested, e.g. Categories?$select=CategoryName,Description.

$skip
How many entries you’d like to skip, e.g. Categories?$skip=4.

$top-
Return entries from the top of the feed, e.g. Categories?$top=4

See MSDN for more options.

 

-- Updated Post --

Thanks to James Hancock for pointing this one out for me. This post is a little misleading in that the $select is currently not supported. Please see http://forums.asp.net/t/1771116.aspx/1?OData%20Support for more information on this. The other query string parameters listed above are supported.




Microsoft Synchronization Services, WCF OData, Sql Azure, WPF, iPhone

clock June 17, 2011 06:07 by author Brian Keating |
Part1 – Setting up your database

I did some work with an interesting piece of tech lately, Microsoft Syncronization services 4.0 CTP. This post aims to give an overview of where to start, but firstly, let me describe the how all this plugs together and what it buys me.

Overview

The OData + Sync protocol uses the OData format for the data payload that can be consumed by clients that are running on any platform. Clients and the service use the protocol to perform synchronization, where a full synchronization is performed the first time and incremental synchronization is performed subsequent times. The protocol is designed with the goal to make it easy to implement the client-side of the protocol, and most (if not all) of the synchronization logic will be running on the service side. OData + Sync is intended to be used to enable synchronization for a variety of sources including, but not limited to, relational databases and file systems.

Server

The CTP release includes server components that make it easy for you to build a sync Web service that exposes data to be synchronized via the OData + Sync protocol. For example, you can easily expose data in a SQL Server database or a SQL Azure database via a WCF sync endpoint using these server components. In our case our server in sitting in the Azure Cloud providing an OData endpoint, the data is also hosted in the Cloud in Sq1 Azure.

Clients

We have 3 clients, (well 4 actually but our Silverlight version has lagged behind and in not yet publically available).

  1. WP7 – Local data stored in Isolated Storage, DataVisualizationToolkit for charting, SL3
  2. iPhone – Connecting directly to the server via OData/Json
  3. ASP.MVC Ajax – A powerful web interface written using MVC3 and jQuery
  4. Silverlight – Initially used RIA Services to access the server but synchronization model is nearly identical to the WP7 SL3 approach with isolated storage now.

How to create the server.

  1. Create you database schema in SSMS (SqlServer managment studio)
  2. Now that your database has been created you’ll need to provision it, think of this much in the same way that you would provision an existing sql server database for asp membership tables and stored procedures. The syncronization framework will provide you with a tool called SyncSvcUtilHelper.exe this basically is a GUI for the command line version.

image

before provisioning you’ll need to create a Sync configuration, so choose option on, select a filename in step 1 and select your database in step2

image

image

Select the list of tables that you are interested in syncing

image

That’s pretty much it. Now you’ll need to choose option2 to provision the database.
Select the configuration file you created as part of step 1 and choose the provisioning option.

image

That’s all that’s involved, your Database is now ready to be synchronized, of course there are come considerations, unique id’s etc, but you’ll find all this in the documentation.

 

My next post will cover creating the WCF service for exposing the database, after that I’ll run through creating the clients.