0

Windows Azureテーブルストレージで、次のクエリを実行しています。

CloudTableClient ctc=TableStorage.getTableClient();
String q1=TableQuery.generateFilterCondition(TableConstants.PARTITION_KEY, QueryComparisons.EQUAL, Long.toHexString(partitionId));
TableQuery<Actividad> rangeQuery=TableQuery.from(tableName, Actividad.class).where(q1).take(2);
int e=0;
for(Actividad ac:ctc.execute(query)){
    e++;
}
System.out.println(e);

しかし、take(2)で指定された上位2つだけでなく、パーティション上のすべての行を取得しています。

なにか提案を?

smarxに答える:

Wiresharkを使用してhttpリクエストを確認します。

最初のリクエストは次のとおりです。

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&$top=2&timeout=60

サービスからの応答があり、その後、多くの要求が行われます。

GET /actividadreciente? $filter=PartitionKey%20eq%20%2717%27&$top=2&NextRowKey=1%2124%21RkZGRkZFQzY2REYzMTA3Mw--&timeout=60&NextPartitionKey=1%214%21MTc-

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&$top=2&NextRowKey=1%2124%21RkZGRkZFQzY3Mjk2MEZEOA--&timeout=60&NextPartitionKey=1%214%21MTc-

GET /actividadreciente?$filter=PartitionKey%20eq%20%2717%27&$top=2&NextRowKey=1%2124%21RkZGRkZFQzY3Mjk5MzVGOQ--&timeout=60&NextPartitionKey=1%214%21MTc-

等々。

4

1 に答える 1

0

Smarx の言うとおりです。すべての結果を反復処理できますが、最初の 2 つだけを反復処理すると、ライブラリはそれらの項目のみを要求します。後続の反復は、追加の要求で行われます。したがって、解決策は次のコードを使用することです。

CloudTableClient ctc=TableStorage.getTableClient();
final int limit=2;
String q1=TableQuery.generateFilterCondition(TableConstants.PARTITION_KEY, QueryComparisons.EQUAL, Long.toHexString(partitionId));
TableQuery<Actividad> rangeQuery=TableQuery.from(tableName, Actividad.class).where(q1).take(limit);
int e=0;
for(Actividad ac:ctc.execute(query)){
    e++;
    //Use ac
    if(e==limit)break;
}
System.out.println(e);

どうもありがとうSmarx!

于 2012-09-27T22:08:21.600 に答える