使用Execute对AsTableServiceQuery的指导

时间:2012-10-31 16:54:59

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

我注意到,当我在CloudTableQuery上调用Execute()时,它不会立即向Azure发出请求。拿这个代码,例如:

var results = 
(from e in tableContext.CreateQuery<T>(tableName)
where e.PartitionKey == something
select e).AsTableServiceQuery().Execute();

只有在我稍后使用结果时才会发出对Azure的请求:

foreach(var item in results) ...

如果是这种情况,那么在我的代码片段中显式调用Execute是没有意义的。我对这种行为感到有点困惑,这让我想问:需要公开公开暴露执行()的场景是什么?

3 个答案:

答案 0 :(得分:0)

如果您在GitHub上查看TableServiceQuery.cs的源代码,您将看到以下内容。深入挖掘,您可以通过调用Execute()

来查看重试策略,服务器超时和最大执行时间等。
    [DoesServiceRequest]
    public IEnumerable<TElement> Execute(TableRequestOptions requestOptions = null, OperationContext operationContext = null)
    {
        requestOptions = TableRequestOptions.ApplyDefaults(requestOptions, this.Context.ServiceClient);
        operationContext = operationContext ?? new OperationContext();
        long takeCount = TableUtilities.GetQueryTakeCount(this.Query, long.MaxValue);
        return
            General.LazyEnumerable(
                (continuationToken) =>
                this.ExecuteSegmentedCore((TableContinuationToken)continuationToken, requestOptions, operationContext),
                takeCount,
                operationContext);
    }

答案 1 :(得分:0)

在编写了几个查询之后,似乎Execute()对LINQ查询组合很有帮助。表客户端不支持某些LINQ运算符,例如可以使用Any()Execute()方法继续IEnumerable<T>上的合成。

(from e in tableContext.CreateQuery<T>(tableName)
 where e.PartitionKey == "something"
 select e).AsTableServiceQuery(tableContext).Execute().Any()

答案 2 :(得分:0)

Linq查询在您开始使用时执行,因此对于IEnumerable,当您开始枚举时执行查询。

var query = (from e in tableContext.CreateQuery<T>(tableName)
    where e.PartitionKey == "something"
    select e).AsTableServiceQuery(tableContext).Execute();


foreach(var element in query)
{ 
    // the query has been executed
}

所以你需要转换你的查询以确保执行( .First(),. ToList()):

// Retreive the fisrt element
var element = (from e in tableContext.CreateQuery<T>(tableName)
    where e.PartitionKey == "something"
    select e).AsTableServiceQuery(tableContext).Execute().First();

// Retreive all the elements
var elements = (from e in tableContext.CreateQuery<T>(tableName)
    where e.PartitionKey == "something"
    select e).AsTableServiceQuery(tableContext).Execute().ToList();