This past week I’ve been working on a little project – amazing how less email equates to more time for other endeavors – and I was surprised when I received a DataServiceQueryException when querying table storage in the local storage emulator. I was querying based on partition and row keys and, if no data matched the statement, I received an HTTP 404: Resource Not Found exception.
I was initially puzzled. Shouldn’t I receive an empty set or null instead?
Of course, I had forgotten that this is by design. The DataServiceContext will throw a DataServiceQueryException if there’s no data to return. To receive an empty set it’s necessary to set the IgnoreResourceNotFoundException property to true.
Here’s a simplified version of the code:
string connectionString = "UseDevelopmentStorage=true";
var context = CloudStorageAccount.Parse(connectionString).CreateCloudTableClient)
.GetDataServiceContext();
context.IgnoreResourceNotFoundException = true;
var results = context.CreateQuery<TableEntity>("tableName")
.Where(e => e.PartitionKey == partitionKey && e.RowKey == rowKey).AsTableServiceQuery();
var key = results.FirstOrDefault();
Problem solved. No DataServiceQueryException!
Something to keep in mind when working with the Windows Azure table storage service. I almost didn’t blog about but decided that it was worth a few minutes effort. Probably something to add to your Windows Azure development checklist (you have one, right?).