Esercitazione: Eseguire query in Azure Cosmos DB con l'API per Table

SI APPLICA A: Tabella

Azure Cosmos DB for Table supporta l'esecuzione di query OData e LINQ sui dati chiave/valore (tabella).

Questo articolo illustra le attività seguenti:

  • Esecuzione di query sui dati con l'API per Table

Le query di questo articolo usano la tabella di esempio People:

PartitionKey RowKey E-mail PhoneNumber
Harp Walter Walter@contoso.com 425-555-0101
Smith Ben Ben@contoso.com 425-555-0102
Smith Jeff Jeff@contoso.com 425-555-0104

Vedere Query di tabelle ed entità per informazioni dettagliate su come eseguire una query usando l'API per Table.

Prerequisiti

Per il funzionamento di queste query è necessario disporre di un account Azure Cosmos DB e nel contenitore devono essere presenti dati di entità. Se non si dispone di dati o di un account, completare Avvio rapido: Azure Cosmos DB for Table per .NET per creare un account e popolare il database.

Query su PartitionKey e RowKey

Poiché le proprietà PartitionKey e RowKey costituiscono la chiave primaria di un'entità, è possibile usare la sintassi speciale seguente per identificare l'entità:

Query

https://<mytableendpoint>/People(PartitionKey='Harp',RowKey='Walter')

Risultati

PartitionKey RowKey E-mail PhoneNumber
Harp Walter Walter@contoso.com 425-555-0104

In alternativa, è possibile specificare queste proprietà come parte dell'opzione $filter, come illustrato nella sezione seguente. I nomi delle proprietà chiave e i valori costanti distinguono tra maiuscole e minuscole. Entrambe le proprietà PartitionKey e RowKey sono di tipo String.

Eseguire una query usando un filtro OData

Quando si crea una stringa di filtro, tenere presente queste regole:

  • Usare gli operatori logici definiti dalla specifica del protocollo OData per confrontare una proprietà con un valore. Non è possibile confrontare una proprietà con un valore dinamico. Un lato dell'espressione deve essere una costante.
  • Il nome della proprietà, l'operatore e il valore costante devono essere separati da spazi con codifica URL. Uno spazio con codifica URL è come %20.
  • Viene effettuata la distinzione tra maiuscole e minuscole per tutte le parti della stringa di filtro.
  • Il valore costante deve essere dello stesso tipo di dati della proprietà affinché il filtro restituisca risultati validi. Per altre informazioni sui tipi di proprietà supportati, vedere Informazioni sul modello di dati del servizio Table.

La query di esempio illustra come filtrare in base alla proprietà PartitionKey Email usando un $filter ODATA.

Query

https://<mytableapi-endpoint>/People()?$filter=PartitionKey%20eq%20'Smith'%20and%20Email%20eq%20'Ben@contoso.com'

Per altre informazioni su come creare espressioni filtro per vari tipi di dati sono disponibili in Querying Tables and Entities (Esecuzione di query su tabelle ed entità).

Risultati

PartitionKey RowKey E-mail PhoneNumber
Smith Ben Ben@contoso.com 425-555-0102

Le query sulle proprietà datetime non restituiscono dati quando vengono eseguite nell'API per Table di Azure Cosmos DB. Mentre Azure Table Storage archivia i valori di data con la granularità temporale dei tick, l'API per Table di Azure Cosmos DB usa la proprietà _ts. La proprietà _ts si trova a un secondo livello di granularità, che non corrisponde a un filtro OData. Azure Cosmos DB blocca le query sulle proprietà timestamp. Per ovviare al problema, è possibile definire una proprietà di tipo datetime o dati long personalizzata e impostare il valore della data dal client.

Eseguire una query utilizzando LINQ

È anche possibile eseguire query con LINQ, che consente di tradurle nelle corrispondenti espressioni di query OData. L'esempio seguente mostra come compilare le query usando .NET SDK:

IQueryable<CustomerEntity> linqQuery = table.CreateQuery<CustomerEntity>()
            .Where(x => x.PartitionKey == "4")
            .Select(x => new CustomerEntity() { PartitionKey = x.PartitionKey, RowKey = x.RowKey, Email = x.Email });

Passaggi successivi

È ora possibile passare all'esercitazione successiva per imparare a distribuire i dati a livello globale.