3

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 を明示的に呼び出しても意味がありません。私はこの動作に少し混乱しているので、次の質問をするようになります: Execute() を公開する必要があるシナリオは何ですか?

4

3 に答える 3

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()
于 2012-11-15T19:29:28.697 に答える
0

Linq クエリは使用開始時に実行されるため、 forIEnumerableでは列挙開始時にクエリが実行されます。

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();
于 2015-12-14T23:10:03.303 に答える
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);
    }
于 2012-11-01T19:14:46.817 に答える