Conditions de filtrage multiples

Comment puis-je configurer plusieurs filtres sur une table de stockage Azure?

voici ce que j'ai essayé:

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

Cela ne marche pas TableQuery.CombineFilters() ne prend que 3 paramètres. Et j'ai besoin d'un paramètre supplémentaire pour le 2ème jour.

Mon deuxième essai:

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

renvoie 400 bad request. Mais si je supprime le 'datetime' il s'exécute mais ne renvoie aucun résultat alors qu'il devrait renvoyer quelques 100 enregistrements.

Selon doc à partir de msdn, c'est ainsi que les datetimes doivent être formatées.

mon résultat devrait être tous les enregistrements qui sont entre deux dates.

Comment faire pour que ça marche?

16
demandé sur Quoter 2013-08-31 19:10:39

5 réponses

D'abord "et" votre filtre de partition avec l'un des filtres de date, puis "et" le résultat intermédiaire avec l'autre filtre de date.

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);
33
répondu Damith 2016-09-16 01:21:09

Comment puis-je configurer plusieurs filtres sur une table de stockage azurée?

je me demandais la même chose. J'ai écrit une extension du cours de vaisselle qui fonctionne très bien.

c'est un changement facile qui me fait me demander si nous allons interroger avec plusieurs filtres incorrectement.

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
répondu LivingOnACloud 2014-12-11 11:18:03

j'utilise Stockage Windows Azure 7.0.0 et vous pouvez utiliser une requête Linq de sorte que vous n'avez pas besoin de combiner des filtres plus:

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

Voici la requête générée :

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

Vous pouvez remarquer que:

  • Les filtres ont été combinées.
  • les dates ont été convertis en UTC.
9
répondu Thomas 2016-04-10 22:19:43

je voulais juste ajouter une autre réponse.

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

la raison pour laquelle le code ci-dessus échoue est que la valeur date/heure doit être entrée dans yyyy-MM-ddTHH:mm:ssZ format. Afin que votre requête devrait être:

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
répondu Gaurav Mantri 2013-08-31 18:17:34

juste en traitant le cas d'une nouvelle requête qui n'a pas déjà de filtre et basé sur @LivingOnACloud, je préférerais l'écrire de cette façon:

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

et le reste suit le même chèque, les choses peuvent aller mieux.

0
répondu Assil 2018-07-15 11:39:29