多个过滤条件Azure表存储

时间:2013-08-31 15:10:39

标签: c# azure azure-table-storage

如何在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。但是如果我删除'datetime'它会运行但是没有返回结果,而它应该返回几个100条记录。

根据msdn的this doc,这就是应该如何格式化日期时间。

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

我该如何做到这一点?

4 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:13)

  

如何在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;
    }
}

答案 2 :(得分:5)

只想再添加一个答案。

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

答案 3 :(得分:1)

仅处理基于@LivingOnACloud的尚未具有过滤器的新查询的情况,我宁愿这样写:

class Model < ApplicationRecord
  validate :json_field_format

  def parsed_json_field
    JSON.parse(json_field)
  end

  private

  def json_field_format
    return if json_field.blank?
    begin
      parsed_json_field
    rescue JSON::ParserError => e
      errors[:json_field] << "not is json format" 
    end
  end
end

其余的检查相同,情况会更好。