2012-11-19 5 views

Antwort

12

Die Take-Methode auf dem Storage SDK funktioniert nicht wie in LINQ. Stellen Sie sich so etwas tun:

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 

Wenn Sie über result beginnen Iterieren Sie zunächst nur 5 Einzelteile erhalten werden. Aber darunter, wenn Sie weiter über die result iterieren, wird das SDK weiterhin die Tabelle abfragen (und mit der nächsten "Seite" von 5 Elementen fortfahren).

Wenn ich 5000 Artikel in meinem Tisch haben, wird dieser Code-Ausgabe alle 5000 Punkte (und unter der SDK 1000 Anfragen tun und 5 Artikel pro Anfrage holen):

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 
foreach (var item in result) 
{ 
    Trace.WriteLine(item.RowKey); 
} 

Der folgende Code holen genau 5 Artikel in 1 Anfrage und stoppen dort:

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 
int index = 0; 
foreach (var item in result) 
{ 
    Console.WriteLine(item.RowKey); 
    index++; 
    if (index == 5) 
     break; 
} 

Eigentlich ist die nehmen() Methode setzt die Seitengröße oder die "take count" (TakeCount Eigenschaft auf TableQuery). Aber es liegt immer noch an Ihnen, nicht mehr rechtzeitig zu iterieren, wenn Sie nur 5 Datensätze wünschen.

In Ihrem Beispiel sollen Sie die while-Schleife ändern zu stoppen, wenn die TakeCount erreichen (die Sie durch den Aufruf Nehmen eingestellt):

while (entryList.Count < query.TakeCount && (currentSegment == null || currentSegment.ContinuationToken != null)) 
{ 
    currentSegment = table.ExecuteQuerySegmented(query, currentSegment != null ? currentSegment.ContinuationToken : null); 
    entryList.AddRange(currentSegment.Results); 
} 
+0

Vielen Dank für eine tolle Erklärung! –

+4

Sandrino, bist du dir sicher über die Antwort? In meinem Test funktioniert Take korrekt. Vielleicht verweisen Sie auf eine alte und abgehört Version von StorageClient https://github.com/WindowsAzure/azure-sdk-for-net/issues/144 –

+0

Nuget 9.1.0 hat immer noch das Problem und musste der Empfehlung hier folgen. –

Verwandte Themen