Multiple filter conditions Azure table storage

Quoter picture Quoter · Aug 31, 2013 · Viewed 45.3k times · Source

How can I set multiple filters on a Azure Table Storage?

This is what I've tried:

string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "partition1");
string date1 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.GreaterThanOrEqual, "31-8-2013T14:15:14Z");
string date2 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.LessThanOrEqual, "31-8-2013T14:15:14Z");
string finalFilter = TableQuery.CombineFilters(partitionFilter, TableOperators.And, date1);

This doesn't work because TableQuery.CombineFilters() only takes 3 parameters. And I need an extra parameter for the 2nd date.

My second try:

string filter = "PartitionKey eq 'partition1' and Date ge datetime'31-8-2013T14:15:14Z' and Date lt datetime'31-8-2013T14:19:10Z'";
TableQuery<CustomEntity> query = new TableQuery<CustomEntity>().Where(filter).Take(5);

This returns 400 bad request. But if I remove the 'datetime' it runs but returns no results while it should return a few 100 records.

According to this doc from msdn, that is how datetimes should be formatted.

My result should be all records that are between two dates.

How can I make this work?

Answer

Damith picture Damith · Aug 31, 2013

First "and" your partition filter with one of the date filters, then "and" the intermediate result with the other date filter.

string date1 = TableQuery.GenerateFilterConditionForDate(
                   "Date", QueryComparisons.GreaterThanOrEqual,
                   DateTimeOffsetVal);
string date2 = TableQuery.GenerateFilterConditionForDate(
                   "Date", QueryComparisons.LessThanOrEqual,
                   DateTimeOffsetVal);
string finalFilter = TableQuery.CombineFilters(
                        TableQuery.CombineFilters(
                            partitionFilter,
                            TableOperators.And,
                            date1),
                        TableOperators.And, date2);