Azure 使用Execute的AsTableServiceQuery指南
我注意到,当我对CloudTableQuery调用Execute()时,它不会立即向Azure发出请求。以这段代码为例: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(); 如果是这种情况,那么在我的代码片段中执行显式调用就没有意义了。我对这种行为感到有
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();