如何在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,这就是应该如何格式化日期时间。
我的结果应该是两个日期之间的所有记录。
我该如何做到这一点?
答案 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
其余的检查相同,情况会更好。