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つのパラメータしかとらないため、これは機能しません。そして、2 番目の日付には追加のパラメーターが必要です。

私の2回目の試み:

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 のこのドキュメントによると、それが日時のフォーマット方法です。

私の結果は、2 つの日付の間にあるすべてのレコードになるはずです。

どうすればこれを機能させることができますか?

4

5 に答える 5

65

最初にパーティション フィルターを日付フィルターの 1 つと "and" し、次に中間結果を他の日付フィルターと "and" します。

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')) and (Timestamp le datetime'2016-02-01T11:00:00Z')

次のことがわかります。

  • フィルターを組み合わせました。
  • 日付は UTC に変換されています。
于 2016-04-10T22:19:43.930 に答える
9

もう1つ答えを追加したかっただけです。

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 に答える