2013-08-31 21 views
15

?Çoklu filtre koşulları Azure tablo depolama

Bu denedim budur: TableQuery.CombineFilters() sadece 3 parametre alır çünkü

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

Bu işe yaramaz. Ve 2. tarih için ekstra bir parametreye ihtiyacım var.

Benim ikinci deneyin:

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

Bu 400 bad request döndürür. Ancak 'datetime' öğesini kaldırırsam çalışır, ancak birkaç 100 kayıt döndürürken sonuç döndürmez.

msdn this dokümana göre, bu tarihsaat biçimlendirilmesi gerektiğini nasıl.

Benim sonuç iki tarih arasındaki tüm kayıtları olabilir.

Bu işi nasıl yapabilirim?

cevap

28

İlk "ve" o zaman tarih filtreleri biriyle bölüm filtresi "ve" diğer tarih filtreli ara sonuç.

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); 
+0

Çözümünüzü denedim, derler ve çalışır, ancak hiçbir kayıt döndürülmez. Bildiğiniz DateTime karşılaştırmaları için yapmam gereken özel 'şeyler' var mı? – Quoter

+2

Yaptığınız her filtre türü için farklı numaralar var gibi görünüyor. Ve bugüne kadar 'TableQuery.GenerateFilterConditionForDate'. Ve bu hile yaptı. Damith, bunu cevabın için de yapabilir misin? – Quoter

4

Sadece bir yanıt daha eklemek istedim. tarih/saat değeri yyyy-MM-ddTHH:mm:ssZ biçiminde girilmelidir çünkü neden kodu yukarıdaki başarısız

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

olduğunu. Yani sorgu olmalıdır:

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); 
+0

Güzel, bu çalışma wel. Teşekkürler! – Quoter

11

nasıl Azure Tablo Depolama birden çok filtre ayarlayabilirsiniz?

Ben de aynı şeyi merak ediyorum. Ben iyi çalışıyor TableQuery sınıfına bir uzantı yazdım.

Biz yanlış çoklu filtreler kullanılarak sorgulama hakkında gidiyoruz eğer beni merak yapar kolay bir değişikliktir.

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; 
    } 
} 
+0

Birden çok "Or" filtresi ekliyorsanız, FilterString '((() veya (Foo eq' 1 ')) veya (Foo eq' 2 ')) veya (Foo eq' 3 ') 'gibi görünecektir . 'FilterString' boşsa, sadece filtrenin kendisini ekleyin: '@this.FilterString = @ this.FilterString == null? filter: TableQuery.CombineFilters (@ this.FilterString, TableOperators.Or, filter); '. –

7

Ben Windows Azure Storage 7.0.0 kullanıyorum ve artık filtreleri birleştirmek gerekmez böylece Linq sorgusu kullanabilirsiniz:

İşte
// 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(); 

oluşturulan sorgu:

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

Bunu fark edebilirsiniz:

  • filtreler birleştirilmiştir.
  • Tarihler UTC'ye dönüştürülmüştür.
İlgili konular