webentwicklung-frage-antwort-db.com.de

Mehrere Filterbedingungen Azure-Tabellenspeicher

Wie kann ich mehrere Filter für einen Azure Table Storage festlegen?

Das habe ich versucht:

string partitionFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "partition1");
string date1 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.GreaterThanOrEqual, "31-8-2013T14:15:14Z");
string date2 = TableQuery.GenerateFilterCondition("Date", QueryComparisons.LessThanOrEqual, "31-8-2013T14:15:14Z");
string finalFilter = TableQuery.CombineFilters(partitionFilter, TableOperators.And, date1);

Dies funktioniert nicht, da TableQuery.CombineFilters() nur 3 Parameter benötigt. Und ich brauche einen zusätzlichen Parameter für das 2. Datum.

Mein zweiter Versuch:

string filter = "PartitionKey eq 'partition1' and Date ge datetime'31-8-2013T14:15:14Z' and Date lt datetime'31-8-2013T14:19:10Z'";
TableQuery<CustomEntity> query = new TableQuery<CustomEntity>().Where(filter).Take(5);

Dies gibt 400 bad request zurück. Wenn ich jedoch die 'datetime' entferne, wird sie ausgeführt, gibt jedoch keine Ergebnisse zurück, während sie einige 100 Datensätze zurückgeben sollte.

Laut this doc von msdn sollte dies so sein, dass dat times formatiert werden sollte.

Mein Ergebnis sollte alle Datensätze sein, die zwischen zwei Datumsangaben liegen.

Wie kann ich diese Arbeit machen?

20
Quoter

Zuerst "und" Ihr Partitionsfilter mit einem Datumsfilter, dann "und" das Zwischenergebnis mit dem anderen Datumsfilter.

string date1 = TableQuery.GenerateFilterConditionForDate(
                   "Date", QueryComparisons.GreaterThanOrEqual,
                   DateTimeOffsetVal);
string date2 = TableQuery.GenerateFilterConditionForDate(
                   "Date", QueryComparisons.LessThanOrEqual,
                   DateTimeOffsetVal);
string finalFilter = TableQuery.CombineFilters(
                        TableQuery.CombineFilters(
                            partitionFilter,
                            TableOperators.And,
                            date1),
                        TableOperators.And, date2);
35
Damith

Wie kann ich mehrere Filter für einen Azure Table Storage festlegen?

Ich wunderte mich dasselbe. Ich habe eine Erweiterung für die TableQuery-Klasse geschrieben, die gut funktioniert.

Es ist eine einfache Änderung, die mich fragt, ob wir mit mehreren Filtern falsch abfragen.

public static class TableQueryExtensions 
{
    public static TableQuery<TElement> AndWhere<TElement>(this TableQuery<TElement> @this, string filter)
    {
        @this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.And, filter);
        return @this;
    }

    public static TableQuery<TElement> OrWhere<TElement>(this TableQuery<TElement> @this, string filter)
    {
        @this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.Or, filter);
        return @this;
    }

    public static TableQuery<TElement> NotWhere<TElement>(this TableQuery<TElement> @this, string filter)
    {
        @this.FilterString = TableQuery.CombineFilters(@this.FilterString, TableOperators.Not, filter);
        return @this;
    }
}
12
LivingOnACloud

Ich verwende Windows Azure Storage 7.0.0 und Sie können die Linq-Abfrage verwenden, damit Sie keine Filter mehr kombinieren müssen:

// filter dates for test
var startDate = DateTime.Parse("01/02/2016 12:00:00 AM"); 
var endDate = DateTime.Parse("02/02/2016 12:00:00 AM");

// Get the cloud table
var cloudTable = GetCloudTable();

// Create a query: in this example I use the DynamicTableEntity class
var query = cloudTable.CreateQuery<DynamicTableEntity>()
        .Where(d => d.PartitionKey == "partition1"
               && d.Timestamp >= startDate && d.Timestamp <= endDate);

// Execute the query
var result = query.ToList();

Hier ist die generierte Abfrage:

((PartitionKey eq 'partition1') und (Timestamp ge datetime'2016-01-31T11: 00: 00Z ')) und (Timestamp le datetime'2016-02-01T11: 00: 00Z') 

Sie können das feststellen:

  • Die Filter wurden kombiniert.
  • Die Daten wurden in UTC konvertiert.
11
Thomas

Ich wollte nur noch eine Antwort hinzufügen.

string filter = "PartitionKey eq 'partition1' and Date ge datetime'31-8-2013T14:15:14Z' and Date lt datetime'31-8-2013T14:19:10Z'";
TableQuery<TablePost> query = new TableQuery<TablePost>().Where(filter).Take(5);

Der oben angegebene Ursachencode schlägt fehl, weil der Datums-/Uhrzeitwert im yyyy-MM-ddTHH:mm:ssZ-Format eingegeben werden muss. Ihre Anfrage sollte also lauten:

string filter = "(PartitionKey eq 'partition1') and (Date ge datetime'2013-08-31T14:15:14Z' and Date lt datetime'2013-08-31T14:19:10Z')";
TableQuery<TablePost> query = new TableQuery<TablePost>().Where(filter).Take(5);
5
Gaurav Mantri

Wenn Sie nur den Fall einer neuen Abfrage behandeln, der noch kein Filter vorhanden ist, und auf @LivingOnACloud basierend, schreibe ich sie lieber so:

 public static TableQuery<TElement> AndWhere<TElement>(this TableQuery<TElement> query, string filter)
            where TElement : ITableEntity,new ()
        {
            if (query.FilterString.IsNullOrEmpty())
            {
                query.FilterString =  filter;
            }
            else
            {
                query.FilterString = TableQuery.CombineFilters(query.FilterString, TableOperators.And, filter);
            }
            return query;
        }

Und der Rest folgt dem gleichen Check, die Dinge können schöner werden.

0
Assil