How can I set multiple filters on a Azure Table Storage?
This is what I\'ve tried:
string partitionFilter = TableQuery.GenerateFilterCondition(\"Partitio
I am using Windows Azure Storage 7.0.0 and you can use Linq query so that you don't need to combine filters anymore:
// filter dates for test
var startDate = DateTime.Parse("01/02/2016 12:00:00 AM");
var endDate = DateTime.Parse("02/02/2016 12:00:00 AM");
// Get the cloud table
var cloudTable = GetCloudTable();
// Create a query: in this example I use the DynamicTableEntity class
var query = cloudTable.CreateQuery<DynamicTableEntity>()
.Where(d => d.PartitionKey == "partition1"
&& d.Timestamp >= startDate && d.Timestamp <= endDate);
// Execute the query
var result = query.ToList();
Here is the generated query :
((PartitionKey eq 'partition1') and (Timestamp ge datetime'2016-01-31T11:00:00Z')) and (Timestamp le datetime'2016-02-01T11:00:00Z')
You can notice that:
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);
Just wanted to add one more answer.
string filter = "PartitionKey eq 'partition1' and Date ge datetime'31-8-2013T14:15:14Z' and Date lt datetime'31-8-2013T14:19:10Z'";
TableQuery<TablePost> query = new TableQuery<TablePost>().Where(filter).Take(5);
The reason code above is failing is because the date/time value must be entered in yyyy-MM-ddTHH:mm:ssZ
format. So your query should be:
string filter = "(PartitionKey eq 'partition1') and (Date ge datetime'2013-08-31T14:15:14Z' and Date lt datetime'2013-08-31T14:19:10Z')";
TableQuery<TablePost> query = new TableQuery<TablePost>().Where(filter).Take(5);
Just handling the case of a new query that does not have a filter already and based on @LivingOnACloud, I would rather write it this way:
public static TableQuery<TElement> AndWhere<TElement>(this TableQuery<TElement> query, string filter)
where TElement : ITableEntity,new ()
{
if (query.FilterString.IsNullOrEmpty())
{
query.FilterString = filter;
}
else
{
query.FilterString = TableQuery.CombineFilters(query.FilterString, TableOperators.And, filter);
}
return query;
}
And the rest follow the same check, things can go nicer.
How can I set multiple filters on a Azure Table Storage?
I was wondering the same thing. I wrote an extension to the TableQuery class which works fine.
It's an easy change which makes me wonder if we are going about querying with multiple filters incorrectly.
public static class TableQueryExtensions
{
public static TableQuery<TElement> AndWhere<TElement>(this TableQuery<TElement> @this, string filter)
{
@this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.And, filter);
return @this;
}
public static TableQuery<TElement> OrWhere<TElement>(this TableQuery<TElement> @this, string filter)
{
@this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.Or, filter);
return @this;
}
public static TableQuery<TElement> NotWhere<TElement>(this TableQuery<TElement> @this, string filter)
{
@this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.Not, filter);
return @this;
}
}