QueryOperations Klasse
Namespace für Abfragevorgänge.
Zugriff über client.query. Stellt Abfrage- und Suchvorgänge für Dataverse-Tabellen bereit.
Beispiel:
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"])
Konstruktor
QueryOperations(client: DataverseClient)
Parameter
| Name | Beschreibung |
|---|---|
|
client
Erforderlich
|
Die übergeordnete DataverseClient Instanz. |
Methoden
| builder |
Erstellen Sie einen Fluent-Abfrage-Generator für die angegebene Tabelle. Gibt einen QueryBuilder Wert zurück, der mit Filter-, Auswahl- und Bestellmethoden verkettet und dann direkt über |
| fetchxml |
Gibt ein inert-Objekt zurück FetchXmlQuery . Es wird keine HTTP-Anforderung ausgeführt, bis execute das zurückgegebene Objekt aufgerufen oder execute_pages aufgerufen wird. Wird für SQL-JOIN Szenarien, aggregierte Abfragen oder andere Vorgänge verwendet, die der OData-Generatorendpunkt nicht ausdrücken kann. Beispiel:
|
| odata_bind |
Erstellen Sie einen Ermittelt automatisch den Namen der Navigationseigenschaft und den Entitätssatznamen aus Metadaten. Gibt ein diktieren, das mit einer Erstellungs- oder Aktualisierungsnutzlast zusammengeführt werden kann. Beispiel:
|
| odata_expand |
Gibt den Namen der Navigationseigenschaft Ermittelt über Beziehungsmetadaten. Gibt die genaue PascalCase-Zeichenfolge für den Beispiel:
|
| odata_expands |
Entdecken Sie alle Gibt Einträge für jede ausgehende Suche (einzelwertige Navigationseigenschaft) zurück. Jeder Eintrag enthält den genauen Namen der PascalCase-Navigationseigenschaft, die für Beispiel:
|
| odata_select |
Gibt eine Liste der logischen Spaltennamen zurück, die geeignet sind. Kann direkt an Beispiel:
|
| sql |
Führen Sie eine schreibgeschützte SQL-Abfrage mit der Dataverse-Web-API aus. Der Dataverse SQL-Endpunkt unterstützt eine breite Teilmenge von T-SQL:
Nicht unterstützt: SELECT >>*<<, Unterabfragen, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, Window Functions, string/date/math functions, INSERT/UPDATE/DELETE. Verwenden Sie |
| sql_columns |
Zurückgeben einer vereinfachten Liste von SQL-verwendbaren Spalten für eine Tabelle. Jedes Diktat enthält Beispiel:
|
builder
Erstellen Sie einen Fluent-Abfrage-Generator für die angegebene Tabelle.
Gibt einen QueryBuilder Wert zurück, der mit Filter-, Auswahl- und Bestellmethoden verkettet und dann direkt über .execute()ausgeführt werden kann.
builder(table: str) -> QueryBuilder
Parameter
| Name | Beschreibung |
|---|---|
|
table
Erforderlich
|
Tabellenschemaname (z. B. |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Eine An diesen Client gebundene QueryBuilder-Instanz. |
Beispiele
Erstellen und Ausführen einer Abfrage fließend:
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"])
Mit erstellungsfähiger Ausdrucksstruktur:
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
Gibt ein inert-Objekt zurück FetchXmlQuery .
Es wird keine HTTP-Anforderung ausgeführt, bis execute das zurückgegebene Objekt aufgerufen oder execute_pages aufgerufen wird.
Wird für SQL-JOIN Szenarien, aggregierte Abfragen oder andere Vorgänge verwendet, die der OData-Generatorendpunkt nicht ausdrücken kann.
Beispiel:
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
Parameter
| Name | Beschreibung |
|---|---|
|
xml
Erforderlich
|
Wohlgeformte FetchXML-Abfragezeichenfolge. Das Stammelement |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Inert-Abfrageobjekt mit |
Ausnahmen
| Typ | Beschreibung |
|---|---|
|
Fehlt das FetchXML-Element |
odata_bind
Erstellen Sie einen @odata.bind Eintrag zum Festlegen eines Nachschlagefelds.
Ermittelt automatisch den Namen der Navigationseigenschaft und den Entitätssatznamen aus Metadaten. Gibt ein diktieren, das mit einer Erstellungs- oder Aktualisierungsnutzlast zusammengeführt werden kann.
Beispiel:
# 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]
Parameter
| Name | Beschreibung |
|---|---|
|
from_table
Erforderlich
|
Schemaname der Entität, die erstellt/aktualisiert wird. |
|
to_table
Erforderlich
|
Schemaname der Zielentität, auf die die Nachschlagepunkte verweisen. |
|
target_id
Erforderlich
|
GUID des Zieldatensatzes. |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Ein Diktat wie |
Ausnahmen
| Typ | Beschreibung |
|---|---|
|
Wenn keine Beziehung zwischen den Tabellen gefunden wurde. |
odata_expand
Gibt den Namen der Navigationseigenschaft $expand von einer Tabelle in eine andere zurück.
Ermittelt über Beziehungsmetadaten. Gibt die genaue PascalCase-Zeichenfolge für den expand= Parameter zurück.
Beispiel:
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
Parameter
| Name | Beschreibung |
|---|---|
|
from_table
Erforderlich
|
Schemaname der Quelltabelle (z. B. |
|
to_table
Erforderlich
|
Schemaname der Zieltabelle (z. B. |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Der Name der Navigationseigenschaft (PascalCase). |
Ausnahmen
| Typ | Beschreibung |
|---|---|
|
Wenn keine Navigationseigenschaft für das Ziel gefunden wurde. |
odata_expands
Entdecken Sie alle $expand Navigationseigenschaften aus einer Tabelle.
Gibt Einträge für jede ausgehende Suche (einzelwertige Navigationseigenschaft) zurück. Jeder Eintrag enthält den genauen Namen der PascalCase-Navigationseigenschaft, die für $expand und @odata.bindden Namen des Zielentitätssatzes benötigt wird.
Beispiel:
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]]
Parameter
| Name | Beschreibung |
|---|---|
|
table
Erforderlich
|
Schemaname der Tabelle (z. B. |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Liste der Diktaten, jeweils mit:
|
odata_select
Gibt eine Liste der logischen Spaltennamen zurück, die geeignet sind.$select
Kann direkt an client.records.get(table, select=...).
Beispiel:
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]
Parameter
| Name | Beschreibung |
|---|---|
|
table
Erforderlich
|
Schemaname der Tabelle (z. B. |
|
include_system
Erforderlich
|
Systemspalten einschließen (Standardeinstellung |
Nur Schlüsselwortparameter
| Name | Beschreibung |
|---|---|
|
include_system
|
Standardwert: False
|
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Liste der logischen Spaltennamen in Kleinbuchstaben. |
sql
Führen Sie eine schreibgeschützte SQL-Abfrage mit der Dataverse-Web-API aus.
Der Dataverse SQL-Endpunkt unterstützt eine breite Teilmenge von 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 * wird nicht unterstützt – Geben Sie Spaltennamen explizit an.
Wird verwendet sql_columns , um verfügbare Spaltennamen für eine Tabelle zu ermitteln.
Nicht unterstützt: SELECT >>*<<, Unterabfragen, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, Window Functions, string/date/math functions, INSERT/UPDATE/DELETE. Verwenden Sie client.records für Schreibvorgänge Methoden.
sql(sql: str) -> List[Record]
Parameter
| Name | Beschreibung |
|---|---|
|
sql
Erforderlich
|
Unterstützte SQL SELECT-Anweisung. |
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Liste der Record Objekte. Gibt eine leere Liste zurück, wenn keine Zeilen übereinstimmen. |
Ausnahmen
| Typ | Beschreibung |
|---|---|
|
Wenn |
Beispiele
Grundlegende Abfrage:
rows = client.query.sql(
"SELECT TOP 10 name FROM account ORDER BY name"
)
JOIN mit Aggregation:
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
Zurückgeben einer vereinfachten Liste von SQL-verwendbaren Spalten für eine Tabelle.
Jedes Diktat enthält name (logischer Name für SQL), type (Dataverse-Attributtyp), is_pk (Primärschlüsselkennzeichnung) und label (Anzeigename). Virtuelle Spalten werden immer ausgeschlossen, da der SQL-Endpunkt sie nicht abfragen kann.
Beispiel:
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]]
Parameter
| Name | Beschreibung |
|---|---|
|
table
Erforderlich
|
Schemaname der Tabelle (z. B. |
|
include_system
Erforderlich
|
Wenn |
Nur Schlüsselwortparameter
| Name | Beschreibung |
|---|---|
|
include_system
|
Standardwert: False
|
Gibt zurück
| Typ | Beschreibung |
|---|---|
|
Liste der Spaltenmetadaten-Diktats. |