Azure存储表不返回整个分区

Azure存储表不返回整个分区,azure,storage,Azure,Storage,我发现生产上有一些情况 CloudContext.TableData.Where( A => A.PartitionKey == "MYKEY").ToList(); TableData在哪里 public DataServiceQuery<T> TableData { get { return CreateQuery<T>( _TableName ); } } publicDataServiceQuery表格数据{get{returnCreateQuery(_

我发现生产上有一些情况

CloudContext.TableData.Where( A => A.PartitionKey == "MYKEY").ToList();
TableData在哪里

public DataServiceQuery<T> TableData { get { return CreateQuery<T>( _TableName ); } }
publicDataServiceQuery表格数据{get{returnCreateQuery(_TableName);}
不返回整个分区(我在那里的记录少于1000条)

在我的例子中,它返回367条记录,而在VS2010服务器资源管理器或Azure存储资源管理器中,我得到414条记录(条件相同)

有没有人遇到过同样的问题


另外,如果我更改查询并将RowKey添加到条件中,我将毫无问题地获得所需的记录。

这是一种已知的、有文档记录的行为。表服务API将在5秒内返回1000个实体或尽可能多的实体。如果查询执行时间超过5秒,它将返回一个延续令牌

通过添加rowkey,您可以使查询更加具体,从而更快,从而获得所有实体


有关详细信息,请参见MSDN上的

您必须更好地了解表格服务。在正式文件中列出了影响返回记录数量的其他条件。如果您想要检索整个分区,您必须检查TableResult的延续令牌,并使用提供的延续令牌反复执行相同的查询,直到所有结果都出来

您可以使用类似于以下的方法:

private IEnumerable getAllenties()
{
var result=this.\u tables.GetSegmentedEntities(100,null);//null表示继续标记
而(result.Results.Count>0)
{
foreach(result.Results中的var ufs)
{
收益返回新的MyEntityType(ufs.RowKey,ufs.WhateverotherPropertyNeed);
}
if(result.ContinuationToken!=null)
{
结果=此。_tables.GetSegmentedEntities(100,result.ContinuationToken);
}
其他的
{
打破
}
}
}
其中
GetSegmentedEntities(100,result.ContinuationToken)
定义为:

public TableQuerySegment getsegmentedenties(int pageSize,TableContinuationToken)
{
var partKey=“我的所需分区密钥通过常量或方法参数传递”;
TableQuery=新建TableQuery()
.Where(TableQuery.GenerateFilterCondition(“PartitionKey”,QueryComparisons.Equal,partKey));
query.TakeCount=页面大小;
返回此.azureTableReference.ExecuteQuerySegmented(查询,令牌);
}

您可以针对您的案例使用和修改此代码。

如果您得到的是部分结果集,那么将有两个因素

i) 您有1000多条记录与筛选器匹配 ii)查询耗时超过5秒。 iii)查询跨越分区边界

由于您只有不到1000条记录,所以第一个因素不会成为问题。而当您基于PartitionKey相等性进行检索时,第三个因素也不会导致任何问题。你面临这个问题是因为第二个因素


两个处理这一点,您需要处理延续令牌。有关更多信息,请参阅此页。

基于之前的解决方案:修改的代码:TableData->CreateQuery(\u TableName).AsTableServiceQuery();ToList()->public static List ToFullList(此IQueryable源){if(Source==null){throw new ArgumentNullException(“Source”);}返回Source.AsTableServiceQuery().Execute().ToList();}