programing

다중 필터 조건 Azure 테이블 저장소

lastmoon 2023. 6. 21. 22:56
반응형

다중 필터 조건 Azure 테이블 저장소

Azure Table Storage에서 여러 필터를 설정하려면 어떻게 해야 합니까?

이것이 제가 시도한 것입니다.

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'을 제거하면 실행되지만 결과가 반환되지 않고 몇 백 개의 레코드가 반환됩니다.

msdn의 이 문서에 따르면, 그것이 날짜 시간이 포맷되어야 하는 방법입니다.

제 결과는 두 날짜 사이의 모든 기록이어야 합니다.

어떻게 하면 이 일을 해낼 수 있을까요?

먼저 파티션 필터를 날짜 필터 중 하나로 "및"한 다음 중간 결과를 다른 날짜 필터로 "및"합니다.

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

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

생성된 쿼리는 다음과 같습니다.

((PartitionKeyeq 'partition1') 및 (타임스탬프 datetime '2016-01-31T11:00:00Z') 및 (타임스탬프 datetime '2016-02-01T11:00:00Z')

다음을 확인할 수 있습니다.

  • 필터가 결합되었습니다.
  • 날짜가 UTC로 변환되었습니다.

Azure Table Storage에서 여러 필터를 설정하려면 어떻게 해야 합니까?

저도 같은 것이 궁금했습니다.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;
    }
}

답을 하나 더 추가하고 싶었을 뿐입니다.

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

@LivingOn을 기반으로 필터가 아직 없는 새 쿼리의 경우 처리클라우드, 저는 차라리 이렇게 쓰고 싶습니다.

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

그리고 나머지는 같은 점검을 따르며, 상황이 더 나아질 수 있습니다.

언급URL : https://stackoverflow.com/questions/18549555/multiple-filter-conditions-azure-table-storage

반응형