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 | 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 | 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 | 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.