0

開発ストレージの下で、テーブル名に「myprefix」プレフィックスを持つテーブルをいくつか作成しました。次のコードを実行すると、listtables("myprefix") はエントリを返しません。

    [ClassCleanup]
     public static void ClassCleanup()
     {
         var tableClient = _account.CreateCloudTableClient();
         foreach (var table in tableClient.ListTables("myprefix"))
         {
             tableClient.DeleteTableIfExist(table);
         }
     }

listtables() を使用するとすべてのテーブルが返されますが、プレフィックスのオーバーロードが機能しない理由がわかりません。助言がありますか?

4

1 に答える 1

1

これは開発用ストレージのバグだと思います。ListTables(prefix)のコードを調べましたが、これが見つかりました(ListTablesSegmentedImplCore()メソッドの一部のみを貼り付けています)。

if (prefix != string.Empty)
            {                       
                // Append Max char to end  '{' is 1 + 'z' in AsciiTable
                string uppperBound = prefix + '{';

                query = query.Where((table) => table.TableName.CompareTo(prefix) >= 0 && table.TableName.CompareTo(uppperBound) < 0);
            }

したがって、何が起こっているのかというと、次のようなクエリが作成されます。

http://[開発ストレージテーブルエンドポイント]/ devstoreaccount1 / Tables()?$ filter =(TableName ge'a')および(TableName lt'a {')

これで、開発ストレージがデータストレージの舞台裏でSQLServerを使用することがわかりました。このクエリを取得して、そのSQL Serverデータベースに対して同等のクエリを実行すると、結果が返されませんでした。

SELECT TOP 1000 [AccountName]
  ,[TableName]
  ,[LastModificationTime]
  ,[ServiceMetadata]
  ,[Metadata]
  ,[SchemaXml] FROM [DevelopmentStorageDb201206].[dbo].[TableContainer]   Where [TableName] >= 'a' and [TableName] < 'a{'

暫定的には、自分の側でフィルタリングを行う必要があると思います。また、開発ストレージで長い間発見された別のバグがあり、それはテーブルの継続トークンに関係していることに注意してください。テーブルを一覧表示し、ストレージアカウントに1000を超えるテーブルがある場合、開発ストレージでテーブルをフェッチするときに継続トークンは返されません。

お役に立てれば。

于 2012-08-22T04:49:28.687 に答える