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') and (TableName lt 'a{')

现在我们知道开发存储在后台使用 SQL Server 进行数据存储。如果我接受这个查询并针对那个 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 回答