Azure表QuerySegmented无返回

时间:2013-03-21 19:06:17

标签: azure azure-storage azure-table-storage

我正在尝试从AzureTable中提取一组实体,并使用以下代码进行查询。

string partitionKey = string.Format(CultureInfo.InvariantCulture, "{0:d20}", accountId);
string rowKeyStart = string.Format(CultureInfo.InvariantCulture, "{0}:g", work.lead.id);
string rowKeyEnd = string.Format(CultureInfo.InvariantCulture, "{0}:h", work.lead.id);

var context = table.ServiceClient.GetTableServiceContext();
var query = context.CreateQuery<LinkedInPostEntity>(table.Name)
        .Where(w => w.PartitionKey == partitionKey && w.RowKey.CompareTo(rowKeyStart) > 0 && w.RowKey.CompareTo(rowKeyEnd) <= 0)
        .AsTableServiceQuery(context);

List<PostEntity> postsForLead = new List<PostEntity>();
TableContinuationToken continuation = null;

do
{
    TableQuerySegment<PostEntity> segment = await AzureHelper.QuerySegmented(query, continuation);
    postsForLead.AddRange(segment.Results);
    continuation = segment.ContinuationToken;
} while (continuation != null);

table是CloudTable的一个实例,accountId是一个int,work.lead.id是一个字符串。我想拉出所有具有RowKey前缀为work.lead.id:g并且后跟字符串id的实体。我觉得这段代码应该可以正常工作,但它会挂起await永远不会完成QuerySegmented给出的Task

我的想法可能是查询格式不正确,但我不确定如何或为什么。

顺便说一句我是新来的,所以如果我忘记了任何重要信息或者无论如何都可以帮助澄清,请告诉我。

编辑:这是非常相似的代码,它可以在类似(虽然不同)的表上调用,它具有不同的id方案。我需要使用我使用的api给我的id方案,所以我不认为在输入之前重新格式化它是一个选项。两者之间的唯一区别是查询,所以我感觉我的查询是责备。有什么想法吗?

string partitionKey = string.Format(CultureInfo.InvariantCulture, "{0:d20}", accountId);
string rowKeyStart = string.Format(CultureInfo.InvariantCulture, "{0}:{1:d20}", work.ScreenName, (long)0);
string rowKeyEnd = string.Format(CultureInfo.InvariantCulture, "{0}:{1:d20}", work.ScreenName, long.MaxValue);

var context = table.ServiceClient.GetTableServiceContext();
var query = context.CreateQuery<TweetEntity>(table.Name)
        .Where(w => w.PartitionKey == partitionKey && w.RowKey.CompareTo(rowKeyStart) >= 0 && w.RowKey.CompareTo(rowKeyEnd) <= 0)
        .AsTableServiceQuery(context);

List<TweetEntity> tweetsForLead = new List<TweetEntity>();

TableContinuationToken continuation = null;

do
{
    TableQuerySegment<TweetEntity> segment = await AzureHelper.QuerySegmented(query, continuation);
    tweetsForLead.AddRange(segment.Results);
    continuation = segment.ContinuationToken;
} while (continuation != null);

1 个答案:

答案 0 :(得分:0)

我的spidey-sense告诉我你正在调用这个方法,然后在ASP.NET或UI上下文中对返回的任务调用WaitResultIf you do this, you'll deadlock,正如我在博客上解释的那样。