Multiple filter conditions Azure table storage

后端 未结 5 757
半阙折子戏
半阙折子戏 2021-02-02 06:43

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

This is what I\'ve tried:

string partitionFilter = TableQuery.GenerateFilterCondition(\"Partitio         


        
相关标签:
5条回答
  • 2021-02-02 07:15

    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:

    • The filters have been combined.
    • The dates have been converted to UTC.
    0 讨论(0)
  • 2021-02-02 07:20

    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);
    
    0 讨论(0)
  • 2021-02-02 07:26

    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);
    
    0 讨论(0)
  • 2021-02-02 07:29

    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.

    0 讨论(0)
  • 2021-02-02 07:31

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题