Azure 使用Execute的AsTableServiceQuery指南

Azure 使用Execute的AsTableServiceQuery指南,azure,azure-storage,azure-table-storage,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(); 如果是这种情况,那么在我的代码片段中执行显式调用就没有意义了。我对这种行为感到有

我注意到,当我对CloudTableQuery调用Execute()时,它不会立即向Azure发出请求。以这段代码为例:

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

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

如果您查看一下GitHub上的源代码,您将看到以下内容。深入挖掘,您可以看到重试策略、服务器超时和最大执行时间等都是通过调用Execute()设置的

[DoesServiceRequest]
public IEnumerable Execute(TableRequestOptions requestOptions=null,OperationContext OperationContext=null)
{
requestOptions=TableRequestOptions.ApplyDefaults(requestOptions,this.Context.ServiceClient);
operationContext=operationContext??新建operationContext();
long takeCount=TableUtilities.GetQueryTakeCount(this.Query,long.MaxValue);
返回
通用。懒散可枚举(
(continuationToken)=>
此.ExecuteSegmentedCore((TableContinuationToken)continuationToken、requestOptions、operationContext),
算了,
操作上下文);
}

在编写了更多的查询之后,
Execute()
似乎有助于LINQ查询组合。表客户端不支持某些LINQ运算符,例如
Any()
Execute()
方法可用于在
IEnumerable
上继续合成

(来自tableContext.CreateQuery(tableName)中的e)
其中e.PartitionKey==“某物”
选择e).AsTableServiceQuery(tableContext).Execute().Any()

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
}
var query=(来自tableContext.CreateQuery(tableName)中的e)
其中e.PartitionKey==“某物”
选择e).AsTableServiceQuery(tableContext).Execute();
foreach(查询中的var元素)
{ 
//查询已执行
}
因此,您需要转换查询以确保执行(.First(),.ToList()):

//检索第一个元素
var元素=(来自tableContext.CreateQuery(tableName)中的e)
其中e.PartitionKey==“某物”
选择e).AsTableServiceQuery(tableContext).Execute().First();
//检索所有元素
var elements=(来自tableContext.CreateQuery(tableName)中的e)
其中e.PartitionKey==“某物”
选择e).AsTableServiceQuery(tableContext).Execute().ToList();

看起来像新的2.0代码。这与早期版本不同。我相信他们都使用LazyXXX,但是,这告诉我,在你使用它之前,它不会被调用。因此,我看不出使用Execute的理由——只需使用AsEnumerable()或ToArray()来运行。
    [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);
    }
(from e in tableContext.CreateQuery<T>(tableName)
 where e.PartitionKey == "something"
 select e).AsTableServiceQuery(tableContext).Execute().Any()
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
}
// 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();