QueryOperations Classe

Spazio dei nomi per le operazioni di query.

Accesso tramite client.query. Fornisce operazioni di query e ricerca su tabelle dataverse.

Esempio:


   from PowerPlatform.Dataverse.models.filters import col

   client = DataverseClient(base_url, credential)

   # Fluent query builder (recommended)
   for record in (client.query.builder("account")
                  .select("name", "revenue")
                  .where(col("statecode") == 0)
                  .order_by("revenue", descending=True)
                  .top(100)
                  .execute()):
       print(record["name"])

   # SQL query
   rows = client.query.sql("SELECT TOP 10 name FROM account ORDER BY name")
   for row in rows:
       print(row["name"])

Costruttore

QueryOperations(client: DataverseClient)

Parametri

Nome Descrizione
client
Necessario

Istanza padre DataverseClient .

Metodi

builder

Creare un generatore di query Fluent per la tabella specificata.

Restituisce un oggetto QueryBuilder che può essere concatenato con i metodi di filtro, selezione e ordine, quindi eseguiti direttamente tramite .execute().

fetchxml

Restituisce un oggetto inert FetchXmlQuery .

Non viene effettuata alcuna richiesta HTTP finché execute non viene chiamato o execute_pages sull'oggetto restituito.

Usare per scenari SQL-JOIN, query di aggregazione o altre operazioni che l'endpoint del generatore OData non può esprimere.

Esempio:


   query = client.query.fetchxml("""
     <fetch top="50">
       <entity name="account">
         <attribute name="name" />
         <link-entity name="contact" from="parentcustomerid"
                      to="accountid" alias="c" link-type="inner">
           <attribute name="fullname" />
         </link-entity>
       </entity>
     </fetch>
   """)

   # Eager — collect all pages:
   result = query.execute()
   df = result.to_dataframe()

   # Lazy — process one page at a time:
   for page in query.execute_pages():
       process(page.to_dataframe())
odata_bind

Compilare una @odata.bind voce per impostare un campo di ricerca.

Individua automaticamente il nome della proprietà di navigazione e il nome del set di entità dai metadati. Restituisce un dict a voce singola che può essere unito in un payload di creazione o aggiornamento.

Esempio:


   # Instead of manually constructing:
   #   {"parentcustomerid_account@odata.bind": "/accounts(guid)"}
   # Just do:
   bind = client.query.odata_bind("contact", "account", acct_id)
   client.records.create("contact", {
       "firstname": "Jane",
       "lastname": "Doe",
       **bind,
   })
odata_expand

Restituisce il nome della proprietà di navigazione da $expand una tabella a un'altra.

Individua tramite i metadati delle relazioni. Restituisce la stringa PascalCase esatta per il expand= parametro .

Esempio:


   nav = client.query.odata_expand("contact", "account")
   # Returns e.g. "parentcustomerid_account"
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[nav],
                                  top=5):
       for r in page:
           acct = r.get(nav) or {}
           print(f"{r['fullname']} -> {acct.get('name', 'N/A')}")
odata_expands

Individuare tutte le $expand proprietà di navigazione da una tabella.

Restituisce le voci per ogni ricerca in uscita (proprietà di navigazione a valore singolo). Ogni voce contiene il nome esatto della proprietà di navigazione PascalCase necessaria per $expand e @odata.bind, oltre al nome del set di entità di destinazione.

Esempio:


   expands = client.query.odata_expands("contact")
   for e in expands:
       print(f"expand={e['nav_property']}  -> {e['target_table']}")

   # Use in a query
   e = next(e for e in expands if e['target_table'] == 'account')
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[e['nav_property']]):
       ...
odata_select

Restituisce un elenco di nomi logici di colonna adatti per $select.

Può essere passato direttamente a client.records.get(table, select=...).

Esempio:


   cols = client.query.odata_select("account")
   for page in client.records.get("account", select=cols, top=10):
       for r in page:
           print(r)
sql

Eseguire una query SQL di sola lettura usando l'API Web Dataverse.

L'endpoint SQL di Dataverse supporta un ampio subset di T-SQL:


   SELECT / SELECT DISTINCT / SELECT TOP N (0-5000)
   FROM table [alias]
   INNER JOIN / LEFT JOIN (multi-table, no depth limit)
   WHERE (=, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL,
          IS NOT NULL, BETWEEN, AND, OR, nested parentheses)
   GROUP BY column
   ORDER BY column [ASC|DESC]
   OFFSET n ROWS FETCH NEXT m ROWS ONLY
   COUNT(*), SUM(), AVG(), MIN(), MAX()

SELECT * non è supportato: specificare i nomi di colonna in modo esplicito. Usare sql_columns per individuare i nomi di colonna disponibili per una tabella.

Non supportato: SELECT >>*<<, sottoquery, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funzioni finestra, funzioni stringa/data/matematica, INSERT/UPDATE/DELETE. Per le scritture, usare client.records i metodi.

sql_columns

Restituisce un elenco semplificato di colonne utilizzabili da SQL per una tabella.

Ogni dict contiene name (nome logico per SQL), type (tipo di attributo Dataverse), is_pk (flag di chiave primaria) e label (nome visualizzato). Le colonne virtuali vengono sempre escluse perché l'endpoint SQL non può eseguirne query.

Esempio:


   cols = client.query.sql_columns("account")
   for c in cols:
       print(f"{c['name']:30s} {c['type']:20s} PK={c['is_pk']}")

builder

Creare un generatore di query Fluent per la tabella specificata.

Restituisce un oggetto QueryBuilder che può essere concatenato con i metodi di filtro, selezione e ordine, quindi eseguiti direttamente tramite .execute().

builder(table: str) -> QueryBuilder

Parametri

Nome Descrizione
table
Necessario
str

Nome dello schema di tabella ,ad esempio "account".

Valori restituiti

Tipo Descrizione

Istanza di QueryBuilder associata a questo client.

Esempio

Compilare ed eseguire una query in modo fluente:


   from PowerPlatform.Dataverse.models.filters import col

   for record in (client.query.builder("account")
                  .select("name", "revenue")
                  .where(col("statecode") == 0)
                  .where(col("revenue") > 1_000_000)
                  .order_by("revenue", descending=True)
                  .top(100)
                  .page_size(50)
                  .execute()):
       print(record["name"])

Con l'albero delle espressioni componibili:


   from PowerPlatform.Dataverse.models.filters import col

   for record in (client.query.builder("account")
                  .where((col("statecode") == 0) | (col("statecode") == 1))
                  .where(col("revenue") > 100_000)
                  .execute()):
       print(record["name"])

fetchxml

Restituisce un oggetto inert FetchXmlQuery .

Non viene effettuata alcuna richiesta HTTP finché execute non viene chiamato o execute_pages sull'oggetto restituito.

Usare per scenari SQL-JOIN, query di aggregazione o altre operazioni che l'endpoint del generatore OData non può esprimere.

Esempio:


   query = client.query.fetchxml("""
     <fetch top="50">
       <entity name="account">
         <attribute name="name" />
         <link-entity name="contact" from="parentcustomerid"
                      to="accountid" alias="c" link-type="inner">
           <attribute name="fullname" />
         </link-entity>
       </entity>
     </fetch>
   """)

   # Eager — collect all pages:
   result = query.execute()
   df = result.to_dataframe()

   # Lazy — process one page at a time:
   for page in query.execute_pages():
       process(page.to_dataframe())
fetchxml(xml: str) -> FetchXmlQuery

Parametri

Nome Descrizione
xml
Necessario
str

Stringa di query FetchXML ben formata. L'elemento radice <entity name="..."> determina l'endpoint del set di entità.

Valori restituiti

Tipo Descrizione

Oggetto query inert con .execute() i metodi e .execute_pages() .

Eccezioni

Tipo Descrizione

Se FetchXML manca un elemento radice <entity> o l'attributo di entità name .

odata_bind

Compilare una @odata.bind voce per impostare un campo di ricerca.

Individua automaticamente il nome della proprietà di navigazione e il nome del set di entità dai metadati. Restituisce un dict a voce singola che può essere unito in un payload di creazione o aggiornamento.

Esempio:


   # Instead of manually constructing:
   #   {"parentcustomerid_account@odata.bind": "/accounts(guid)"}
   # Just do:
   bind = client.query.odata_bind("contact", "account", acct_id)
   client.records.create("contact", {
       "firstname": "Jane",
       "lastname": "Doe",
       **bind,
   })
odata_bind(from_table: str, to_table: str, target_id: str) -> Dict[str, str]

Parametri

Nome Descrizione
from_table
Necessario
str

Nome dello schema dell'entità da creare/aggiornare.

to_table
Necessario
str

Nome dello schema dell'entità di destinazione a cui punta la ricerca.

target_id
Necessario
str

GUID del record di destinazione.

Valori restituiti

Tipo Descrizione

Un dict come {"NavProp@odata.bind": "/entityset(guid)"}.

Eccezioni

Tipo Descrizione

Se non viene trovata alcuna relazione tra le tabelle.

odata_expand

Restituisce il nome della proprietà di navigazione da $expand una tabella a un'altra.

Individua tramite i metadati delle relazioni. Restituisce la stringa PascalCase esatta per il expand= parametro .

Esempio:


   nav = client.query.odata_expand("contact", "account")
   # Returns e.g. "parentcustomerid_account"
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[nav],
                                  top=5):
       for r in page:
           acct = r.get(nav) or {}
           print(f"{r['fullname']} -> {acct.get('name', 'N/A')}")
odata_expand(from_table: str, to_table: str) -> str

Parametri

Nome Descrizione
from_table
Necessario
str

Nome dello schema della tabella di origine ,ad esempio "contact".

to_table
Necessario
str

Nome dello schema della tabella di destinazione ,ad esempio "account".

Valori restituiti

Tipo Descrizione
str

Nome della proprietà di navigazione (PascalCase).

Eccezioni

Tipo Descrizione

Se non viene trovata alcuna proprietà di navigazione per la destinazione.

odata_expands

Individuare tutte le $expand proprietà di navigazione da una tabella.

Restituisce le voci per ogni ricerca in uscita (proprietà di navigazione a valore singolo). Ogni voce contiene il nome esatto della proprietà di navigazione PascalCase necessaria per $expand e @odata.bind, oltre al nome del set di entità di destinazione.

Esempio:


   expands = client.query.odata_expands("contact")
   for e in expands:
       print(f"expand={e['nav_property']}  -> {e['target_table']}")

   # Use in a query
   e = next(e for e in expands if e['target_table'] == 'account')
   for page in client.records.get("contact",
                                  select=["fullname"],
                                  expand=[e['nav_property']]):
       ...
odata_expands(table: str) -> List[Dict[str, Any]]

Parametri

Nome Descrizione
table
Necessario
str

Nome dello schema della tabella ,ad esempio "contact".

Valori restituiti

Tipo Descrizione

Elenco dict, ognuno con:

  • nav_property – Proprietà di navigazione PascalCase per $expand

  • target_table : nome logico dell'entità di destinazione

  • target_entity_set – set di entità di destinazione (per @odata.bind)

  • lookup_attribute : nome logico della colonna di ricerca

  • relationship – nome dello schema di relazione

odata_select

Restituisce un elenco di nomi logici di colonna adatti per $select.

Può essere passato direttamente a client.records.get(table, select=...).

Esempio:


   cols = client.query.odata_select("account")
   for page in client.records.get("account", select=cols, top=10):
       for r in page:
           print(r)
odata_select(table: str, *, include_system: bool = False) -> List[str]

Parametri

Nome Descrizione
table
Necessario
str

Nome dello schema della tabella ,ad esempio "account".

include_system
Necessario

Includi colonne di sistema (impostazione predefinita False).

Parametri di sole parole chiave

Nome Descrizione
include_system
Valore predefinito: False

Valori restituiti

Tipo Descrizione

Elenco di nomi logici di colonna minuscola.

sql

Eseguire una query SQL di sola lettura usando l'API Web Dataverse.

L'endpoint SQL di Dataverse supporta un ampio subset di T-SQL:


   SELECT / SELECT DISTINCT / SELECT TOP N (0-5000)
   FROM table [alias]
   INNER JOIN / LEFT JOIN (multi-table, no depth limit)
   WHERE (=, !=, >, <, >=, <=, LIKE, IN, NOT IN, IS NULL,
          IS NOT NULL, BETWEEN, AND, OR, nested parentheses)
   GROUP BY column
   ORDER BY column [ASC|DESC]
   OFFSET n ROWS FETCH NEXT m ROWS ONLY
   COUNT(*), SUM(), AVG(), MIN(), MAX()

SELECT * non è supportato: specificare i nomi di colonna in modo esplicito. Usare sql_columns per individuare i nomi di colonna disponibili per una tabella.

Non supportato: SELECT >>*<<, sottoquery, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, funzioni finestra, funzioni stringa/data/matematica, INSERT/UPDATE/DELETE. Per le scritture, usare client.records i metodi.

sql(sql: str) -> List[Record]

Parametri

Nome Descrizione
sql
Necessario
str

Istruzione SQL SELECT supportata.

Valori restituiti

Tipo Descrizione

Elenco di Record oggetti. Restituisce un elenco vuoto quando nessuna riga corrisponde.

Eccezioni

Tipo Descrizione

Se sql non è una stringa o è vuota.

Esempio

Query di base:


   rows = client.query.sql(
       "SELECT TOP 10 name FROM account ORDER BY name"
   )

JOIN con aggregazione:


   rows = client.query.sql(
       "SELECT a.name, COUNT(c.contactid) as cnt "
       "FROM account a "
       "JOIN contact c ON a.accountid = c.parentcustomerid "
       "GROUP BY a.name"
   )

sql_columns

Restituisce un elenco semplificato di colonne utilizzabili da SQL per una tabella.

Ogni dict contiene name (nome logico per SQL), type (tipo di attributo Dataverse), is_pk (flag di chiave primaria) e label (nome visualizzato). Le colonne virtuali vengono sempre escluse perché l'endpoint SQL non può eseguirne query.

Esempio:


   cols = client.query.sql_columns("account")
   for c in cols:
       print(f"{c['name']:30s} {c['type']:20s} PK={c['is_pk']}")
sql_columns(table: str, *, include_system: bool = False) -> List[Dict[str, Any]]

Parametri

Nome Descrizione
table
Necessario
str

Nome dello schema della tabella ,ad esempio "account".

include_system
Necessario

Quando False (impostazione predefinita), le colonne che terminano con suffissi di sistema comuni (_base, versionnumber, timezoneruleversionnumberutcconversiontimezonecode, importsequencenumberoverriddencreatedon) vengono escluse.

Parametri di sole parole chiave

Nome Descrizione
include_system
Valore predefinito: False

Valori restituiti

Tipo Descrizione

Elenco dei set di dati dei metadati della colonna.