2012-10-31 4 views
3

CloudTableQuery에서 Execute()를 호출하면 Azure에 즉시 요청하지 않는다는 것을 알게되었습니다. 예를 들어,이 코드를 가지고 :Execute를 사용하여 AsTableServiceQuery에 대한 지침

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

푸른에 대한 요청은 나중에 결과 소비 할 때 이루어집니다이 경우

foreach(var item in results) ... 

을 다음 명시 적으로있는에 아무 소용이 없다 내 코드 스 니펫에서 Execute를 호출하십시오. 나는이 동작에 대해 다소 혼란스럽고, 묻습니다 : Execute()가 공개적으로 노출되어야하는 시나리오는 무엇입니까?

답변

0

TableServiceQuery.cs의 소스 코드를 GitHub에서 살펴보면 다음과 같이 표시됩니다. 재시도 정책, 몇 쿼리를 작성 후 실행 호출하여 다른 것들()

[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

. 이전 버전에서는 다릅니다. 나는 둘 다 LazyXXX를 사용한다고 믿지만, 나는 당신이 그것으로 무언가를하기 전까지는 호출되지 않을 것이라고 말한다. 따라서 Execute를 사용할 이유가 없습니다. AsEnumerable() 또는 ToArray()를 사용하여 실행하십시오. – dunnry

0

중 서버 시간 제한 및 최대 실행 시간, 당신이 볼 수있는 깊이 파고, 그것은 Execute()처럼 보인다는 LINQ 쿼리 컴포지션 도움이됩니다 . 테이블 클라이언트는 일부 LINQ 연산자에 대한 지원을 제공하지 않습니다. Any()Execute() 방법을 사용하여 조성물을 계속 사용할 수있다. 당신이 그것을 사용하기 시작 때 열거 시작할 때 IEnumerable를 들어, 쿼리가 실행되도록

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

LINQ 쿼리가 실행됩니다.

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 
} 

그래서 당신은 실행 (좁은 방(), .ToList())를 확인하기 위해 쿼리를 변환해야합니다

새로운 2.0 코드처럼 보이는
// 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();