我注意到,当我在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是没有意义的。我对这种行为感到有点困惑,这让我想问:需要公开公开暴露执行()的场景是什么?
答案 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();