3 Stimmen

Anleitung zu AsTableServiceQuery mit der Verwendung von Execute

Ich habe festgestellt, dass beim Aufruf von Execute() für eine CloudTableQuery nicht sofort eine Anfrage an Azure gestellt wird. Nehmen Sie zum Beispiel diesen Code:

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

Die Anfrage an Azure wird erst gestellt, wenn ich das Ergebnis später verbrauche:

foreach(var item in results) ...

Wenn dies der Fall ist, dann hat der explizite Aufruf von Execute in meinem Codeschnipsel keinen Sinn. Ich bin etwas verwirrt von diesem Verhalten, und das führt mich zu fragen: In welchen Szenarien ist es erforderlich, Execute() öffentlich zugänglich zu machen?

0voto

Phil Bolduc Punkte 1576

Wenn Sie einen Blick auf den Quellcode von TableServiceQuery.cs auf GitHub, sehen Sie folgendes. Bei näherer Betrachtung können Sie sehen, dass die Wiederholungsrichtlinie, die Server-Zeitüberschreitung und die maximale Ausführungszeit unter anderem durch den Aufruf von Execute() festgelegt werden

    [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);
    }

0voto

jws_ Punkte 307

Nachdem ich einige weitere Abfragen geschrieben habe, scheint es, dass die Execute() ist hilfreich für die LINQ-Abfragekomposition. Der Tabellen-Client bietet keine Unterstützung für einige LINQ-Operatoren, z. B. Any() y Execute() Methode kann verwendet werden, um die Komposition an einer IEnumerable<T> .

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

0voto

Thomas Punkte 16579

Linq-Abfragen werden ausgeführt, wenn Sie mit der Verwendung beginnen, also für IEnumerable wird Ihre Abfrage ausgeführt, wenn Sie mit der Aufzählung beginnen.

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
}

Sie müssen also Ihre Abfrage konvertieren, um die Ausführung zu gewährleisten ( .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();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X