45

如何在 Azure 表存储上设置多个筛选器?

这是我尝试过的:

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);

这不起作用,因为TableQuery.CombineFilters()只需要 3 个参数。我需要第二个日期的额外参数。

我的第二次尝试:

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);

这返回400 bad request。但是,如果我删除“日期时间”,它会运行但不返回任何结果,而它应该返回几 100 条记录。

根据这个来自 msdn 的文档,这就是日期时间的格式。

我的结果应该是两个日期之间的所有记录。

我怎样才能使这项工作?

4

5 回答 5

65

首先用其中一个日期过滤器“和”您的分区过滤器,然后用另一个日期过滤器“和”中间结果。

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);
于 2013-08-31T15:40:11.663 回答
16

我使用的是Windows Azure Storage 7.0.0,您可以使用 Linq 查询,这样您就不需要再组合过滤器了:

// 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();

这是生成的查询:

((PartitionKey eq 'partition1') and (Timestamp ge datetime'2016-01-31T11:00:00Z')) 和 (Timestamp le datetime'2016-02-01T11:00:00Z')

你可以注意到:

  • 过滤器已合并。
  • 日期已转换为 UTC。
于 2016-04-10T22:19:43.930 回答
15

如何在 Azure 表存储上设置多个筛选器?

我想知道同样的事情。我为 TableQuery 类编写了一个扩展,它工作正常。

这是一个简单的更改,这让我想知道我们是否会错误地使用多个过滤器进行查询。

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;
    }
}
于 2014-12-11T11:18:03.040 回答
9

只是想再添加一个答案。

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);

上面的原因代码失败是因为必须以yyyy-MM-ddTHH:mm:ssZ格式输入日期/时间值。所以你的查询应该是:

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);
于 2013-08-31T18:17:34.983 回答
3

只是处理一个没有过滤器并且基于@LivingOnACloud的新查询的情况,我宁愿这样写:

 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;
        }

其余的都遵循相同的检查,事情会变得更好。

于 2018-07-15T11:39:29.380 回答