TableQuery.CombineFilters: Applicare filtri multipli TableStorage

L’utilizzo del metodo TableQuery.CombineFilters è veramente comodo quando si utilizza un “Azure Table Storage” per le nostre applicazioni. La scorsa settimana ho dovuto fare un code refactoring massiccio nel codice sorgente di un mio cliente. Tra le modifiche da fare vi era quella di applicare una serie di filtri alle query quando in precedenza era solamente uno.

Per farlo ho utilizzato proprio il  TableQuery.CombineFilters  ed ho deciso di mettere a disposizione la classe (o meglio parte della)  da me creata per l’occasione in questo HowTo.

Nuget: WindowsAzure.Storage

Prima di potere utilizzare la classe dovete tramite nuget installare WindowsAzure.Storage o tramite l’interfaccia grafica oppure tramite linea di comando.

Install-Package WindowsAzure.Storage -Version 9.3.3

La versione 9.3.3 è l’ultima rilasciata in questo momento. Eventuali versioni e/o aggiornamenti vi verranno segnalate o dal gestore di pacchetti oppure le troverete sulla pagina ufficiale.

  • TableQuery.CombineFilters*
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

using Microsoft.WindowsAzure.Storage.Table;
using System.Collections.Generic;

namespace DevAndreaCarrattaIT.Azure.Storage
{
    public class TableStorageFilter
    {

        public static string GenerateFilterExpression(List<string> filterExpression)
        {
            string retValue = filterExpression[0];

            if (filterExpression.Count > 1)
            {

                for (int i = 1; i < filterExpression.Count; i++)
                {
                    retValue = TableQuery.CombineFilters(retValue, TableOperators.And, filterExpression[i]);
                }

            }

            return retValue;
        }
    }
}

TableQuery.CombineFilters: Come usarlo

Per utilizzare il “TableQuery.CombineFilters” nella classe appena esposta non serve usarlo. Scusa, ho letto bene? Si, non serve. Per avere la combinazione di più filtri basta solamente chiamare “TableStorageFilter.GenerateFilterExpression” e passare una List ed in uscita ottenere la query da utilizzare.

Vorrei sottolineare due cose importanti sul codice appena scritto:

  1. A differenza del mio solito modo di scrivere il codice non testo se il parametro filterExpression è null oppure non ha valori. Nel momento in cui viene chiamato do per scontato vi sia almeno un elemento.

  2. Se vengono immessi dei filtri vuoti questi vengono tenuti validi e di conseguenza verrà generato un filtro sbagliato.

Il perché?  Personalmente preferisco un errore in fase di sviluppo che una query sbagliata dopo.

Vi lascio dei link di riferimento per maggiori informazioni e/o approfondimenti

TableQuery.CombineFilters(String, String, String) Method

WindowsAzure.Storage (Nuget)