0

私のシナリオを考えてみましょう。約 200 個のパーティションがあり、各パーティションには約 1000 個の行キー (エンティティ) またはそれ以上があります。そのため、アルファベット順で最後 (「z」で始まる) のパーティションのレコードをフェッチするクエリを作成している場合、結果は返されません。

以下はサンプルクエリです -

audioRecordServiceContext.QueryableEntities
                         .Where(p => p.PartitionKey == channel && 
                                     p.IsDedication == true && 
                                     p.IsBroadcast == true && 
                                     p.BroadcastTime >= time && 
                                     p.BroadcastTime < time.AddHours(1))
                         .ToList();

最初のアルファベットで始まるチャネルを渡すと、エンティティが正しく返されますが、おそらく「Z」で始まるチャネルを指定すると、エンティティは返されません。

この問題にどのように取り組むことができるか考えていますか?

編集:

クエリ文字列

http://sampleservice/devstoreaccount1/AudioRecord()?$filter=Username eq 'username'

クエリに対する Fiddler の応答

**HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: application/atom+xml;charset=utf-8
Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 06dff157-f693-49a6-ade7-b7165a4d3dfb
x-ms-version: 2009-09-19
x-ms-continuation-NextPartitionKey: 1!16!QWZnaGFuaXN0YW4-
x-ms-continuation-NextRowKey: 1!48!YTZiOGQxZmYtYjNkYy00NDEyLTk2YmItZTViNmUyMWNhYzJi
Date: Wed, 04 Sep 2013 12:19:03 GMT**
4

1 に答える 1

3

渡されるクエリに基づいて、必要な数のエンティティをフェッチするサンプル コードを次に示します。私の環境では、これにより 10,000 を超えるエンティティが返され、継続トークンが自動的に処理されます。これが使用している SDK のバージョンについては 100% 確信が持てませんが、1.7 で動作するはずです。ここでの魔法は、AsTableServiceQuery によって実行されます。これは、ページネーションと自動再試行の両方を実行する SDK によって提供される拡張メソッドです。

_tableName 変数には、テーブルの名前が含まれています。

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
            TableServiceContext serviceContext = tableClient.GetDataServiceContext();

            var partitionQuery =
                (from e in serviceContext.CreateQuery<MyData1>(_tableName)
                 where e.PartitionKey.CompareTo("15") >= 0 && e.PartitionKey.CompareTo("39") <= 0
                 select new MyData1()
                 {
                     PartitionKey = e.PartitionKey,
                     RowKey = e.RowKey,
                     Timestamp = e.Timestamp,
                     Message = e.Message,
                     Level = e.Level,
                     Severity = e.Severity
                 }
                 ).AsTableServiceQuery();

            return partitionQuery.ToList<MyData1>();

上記のコードは、次のように定義された MyData1 というクラスに依存しています。

public class MyData1 : TableServiceEntity
{
    public string Message { get; set; }
    public string Level { get; set; }
    public string Severity { get; set; }
}

お役に立てれば...

于 2013-09-04T21:51:31.720 に答える