2016-05-13 15 views
0

Ich versuche, Zeile aus Azure-Speicherfilter nur durch Zeilenschlüsselwert zu löschen. Aber ich sehe keine Überladung für Löschvorgang, wo wir mit nur Zeilenschlüssel filtern können. Gibt es eine alternative Option zum Löschen von Zeilen aus der Azure-Speichertabelle für Datensätze mit einem bestimmten Zeilenschlüssel?Azure-Speichertabelle Zeile für Zeile löschen Schlüssel

RemoveEntityByRowKey('123456'); 
public static void RemoveEntityByRowKey(string myRowKey) 
     { 
      try 
      { 
       CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 
         TableOperation delteOperation = TableOperation.Delete(myRowKey); 
       table.Execute(delteOperation); 
      } 
      catch (Exception ex) 
      { 
       LogError.LogErrorToAzure(ex); 
       throw; 
      } 
     } 

Antwort

4

Um ein Objekt zu löschen, Sie beide müssten PartitionKey und RowKey (Delete Entity REST API). Also, was Sie tun müssten, ist zuerst die Entität mit passendem RowKey zu holen. Sobald Sie diese Entität abgerufen haben, sollten Sie in der Lage sein, TableOperation.Delete wie in den Antworten erwähnt aufzurufen.

Allerdings holen Entität von RowKey wird nicht empfohlen, weil es eine vollständige Tabelle Scan tun wird. Es ist möglicherweise kein Problem, wenn Ihre Tabellengröße klein ist, aber ein Problem, bei dem Ihre Tabelle eine große Anzahl von Entitäten enthält. Ferner ist RowKey einzigartig in einer Partition, d. H. In einer Tabelle kann nur eine Einheit mit einer PartitionKey/RowKey Kombination vorhanden sein. Mit anderen Worten, Sie können möglicherweise Entitäten mit demselben RowKey in verschiedenen Partitions haben. Wenn Sie Entitäten nur durch RowKey abrufen, erhalten Sie möglicherweise mehr als eine Entität zurück. Sie müssen sicherstellen, dass Sie die korrekte Entität löschen.

+0

netter und interessanter Zeiger Gaurav. Löschen von Datensätzen basierend auf Zeilenschlüssel ist eine schlechte Idee? Was wäre die beste Option? – Kurkula

+1

Nicht sicher, wie Ihre Tabelle entworfen wurde, aber die beste Option ist, wenn Sie nicht nach einer Entität suchen müssen. Wenn Sie den PartitionKey und RowKey für eine Entität kennen, können Sie damit eine Instanz von TableEntity erstellen und diese Entität dann löschen. –

+0

In meinem Fall ist der Partitionsschlüssel ein Zeit-Tick, der sich häufig ändert und nicht für die Abfrage verwendet werden kann. Deshalb muss ich nur mit Zeilenschlüssel abfragen. – Kurkula

3

Nach Zeile meinen Sie eine Aufzeichnung?

TableOperation.Delete akzeptiert eine Tabelleneinheit. Siehe hier: https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableoperation.delete.aspx

Um diese Entität zu löschen, müssen Sie sie zuerst abrufen, indem Sie ihren Schlüssel Partition und/oder eingeben.

Blick in TableQuery Klasse hier https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tablequery_methods.aspx

Sobald Sie es abrufen, übergeben Sie es Methode zu löschen.

+0

gute Möglichkeit, auf genaue Lösung zu zeigen. Danke Frank. – Kurkula

+0

Sie verdienen wirklich Bounty Bonuspunkte in 2 Tagen. Ihre Antwort diente als nützlicher Zeiger. – Kurkula

0

Mit Bezug auf Franks Zeiger, posten ich Antwort, so dass es für andere nützlich wäre, die das ähnliche Problem haben.

RemoveEntityByRowKey('123456'); 
public static void RemoveEntityByRowKey(string myRowKey) 
     { 
      try 
      { 
       CloudTable table = _tableClient.GetTableReference("MyAzureTable"); 

    TableQuery<myEntity> query = new TableQuery<myEntity>() 
        .Where(TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, myRowKey)); 

       foreach (var item in table.ExecuteQuery(query)) 
       { 
        var oper = TableOperation.Delete(item); 
        table.Execute(oper);      
       } 
      } 
      catch (Exception ex) 
      { 
       LogErrorToAzure(ex); 
       throw; 
      } 
     } 
+1

Obwohl der Ansatz richtig ist, glaube ich nicht, dass Ihr Entwurf sein könnte. Bei Tabellenabfragen müssen Sie versuchen, den Tabellenscan (fast die gesamte Tabelle, die Sie hier vermutlich tun) oder den Partitionsscan (Partitionsscan und einen anderen Schlüssel als den Zeilenschlüssel) zu vermeiden. Die Bereichsabfrage (Angabe der Partition und eines Bereichs des Zeilenschlüssels) ist besser und die Punktabfrage ist die beste. –