QueryOperations 类
查询操作的命名空间。
通过 . 访问 。client.query 针对 Dataverse 表提供查询和搜索操作。
例:
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"])
方法
| builder |
为指定的表创建 Fluent 查询生成器。 返回一个 QueryBuilder 可以链接的筛选器、选择和排序方法,然后直接通过 |
| fetchxml |
返回一个插入 FetchXmlQuery 对象。 在返回的对象上调用或execute_pages调用之前execute,不会发出 HTTP 请求。 用于 SQL-JOIN 方案、聚合查询或其他 OData 生成器终结点无法表达的操作。 例:
|
| odata_bind |
生成用于 从元数据自动发现导航属性名称和实体集名称。 返回可以合并到创建或更新有效负载中的单条目听写。 例:
|
| odata_expand |
将导航属性名称 通过关系元数据发现。 返回参数的确切 PascalCase 字符串 例:
|
| odata_expands |
发现表中的所有 返回每个传出查找(单值导航属性)的条目。 每个条目都包含所需的 例:
|
| odata_select |
返回适合 可以直接传递给 例:
|
| sql |
使用 Dataverse Web API 执行只读 SQL 查询。 Dataverse SQL 终结点支持广泛的 T-SQL 子集:
不支持:SELECT >>*<<, 子查询, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, 窗口函数, 字符串/日期/数学函数, INSERT/UPDATE/DELETE。 对于写入,请使用 |
| sql_columns |
返回表的 SQL 可用列的简化列表。 每个听写内容都包含 例:
|
builder
为指定的表创建 Fluent 查询生成器。
返回一个 QueryBuilder 可以链接的筛选器、选择和排序方法,然后直接通过 .execute()。
builder(table: str) -> QueryBuilder
参数
| 名称 | 说明 |
|---|---|
|
table
必需
|
表架构名称(例如 |
返回
| 类型 | 说明 |
|---|---|
|
绑定到此客户端的 QueryBuilder 实例。 |
示例
以 Fluently 生成和执行查询:
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"])
使用可组合表达式树:
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
返回一个插入 FetchXmlQuery 对象。
在返回的对象上调用或execute_pages调用之前execute,不会发出 HTTP 请求。
用于 SQL-JOIN 方案、聚合查询或其他 OData 生成器终结点无法表达的操作。
例:
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
参数
| 名称 | 说明 |
|---|---|
|
xml
必需
|
格式正确的 FetchXML 查询字符串。 根 |
返回
| 类型 | 说明 |
|---|---|
|
具有 |
例外
| 类型 | 说明 |
|---|---|
|
如果 FetchXML 缺少根 |
odata_bind
生成用于 @odata.bind 设置查阅字段的条目。
从元数据自动发现导航属性名称和实体集名称。 返回可以合并到创建或更新有效负载中的单条目听写。
例:
# Instead of manually constructing:
# {"[email protected]": "/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]
参数
| 名称 | 说明 |
|---|---|
|
from_table
必需
|
正在创建/更新的实体的架构名称。 |
|
to_table
必需
|
查找指向的目标实体的架构名称。 |
|
target_id
必需
|
目标记录的 GUID。 |
返回
| 类型 | 说明 |
|---|---|
|
一个像 |
例外
| 类型 | 说明 |
|---|---|
|
如果未在表之间找到任何关系。 |
odata_expand
将导航属性名称 $expand 从一个表返回到另一个表。
通过关系元数据发现。 返回参数的确切 PascalCase 字符串 expand= 。
例:
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
参数
| 名称 | 说明 |
|---|---|
|
from_table
必需
|
源表的架构名称(例如 |
|
to_table
必需
|
目标表的架构名称(例如 |
返回
| 类型 | 说明 |
|---|---|
|
导航属性名称(PascalCase)。 |
例外
| 类型 | 说明 |
|---|---|
|
如果未找到目标导航属性。 |
odata_expands
发现表中的所有 $expand 导航属性。
返回每个传出查找(单值导航属性)的条目。 每个条目都包含所需的$expand@odata.bind确切 PascalCase 导航属性名称,以及目标实体集名称。
例:
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]]
参数
| 名称 | 说明 |
|---|---|
|
table
必需
|
表的架构名称(例如 |
返回
| 类型 | 说明 |
|---|---|
|
听写列表,每个听写都有:
|
odata_select
返回适合 $select的列逻辑名称的列表。
可以直接传递给 client.records.get(table, select=...)。
例:
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]
参数
| 名称 | 说明 |
|---|---|
|
table
必需
|
表的架构名称(例如 |
|
include_system
必需
|
包括系统列(默认值 |
仅限关键字的参数
| 名称 | 说明 |
|---|---|
|
include_system
|
默认值: False
|
返回
| 类型 | 说明 |
|---|---|
|
小写列逻辑名称的列表。 |
sql
使用 Dataverse Web API 执行只读 SQL 查询。
Dataverse SQL 终结点支持广泛的 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 * 不支持 – 显式指定列名。
用于 sql_columns 发现表的可用列名。
不支持:SELECT >>*<<, 子查询, CTE, HAVING, UNION, RIGHT/FULL/CROSS JOIN, CASE, COALESCE, 窗口函数, 字符串/日期/数学函数, INSERT/UPDATE/DELETE。 对于写入,请使用 client.records 方法。
sql(sql: str) -> List[Record]
参数
| 名称 | 说明 |
|---|---|
|
sql
必需
|
支持的 SQL SELECT 语句。 |
返回
| 类型 | 说明 |
|---|---|
|
Record对象列表。 如果没有行匹配,则返回空列表。 |
例外
| 类型 | 说明 |
|---|---|
|
如果 |
示例
基本查询:
rows = client.query.sql(
"SELECT TOP 10 name FROM account ORDER BY name"
)
联接与聚合:
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
返回表的 SQL 可用列的简化列表。
每个听写内容都包含 name (SQL 的逻辑名称)、 type (Dataverse 属性类型)、 is_pk (主键标志)和 label (显示名称)。 始终排除虚拟列,因为 SQL 终结点无法查询它们。
例:
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]]
参数
| 名称 | 说明 |
|---|---|
|
table
必需
|
表的架构名称(例如 |
|
include_system
必需
|
如果 |
仅限关键字的参数
| 名称 | 说明 |
|---|---|
|
include_system
|
默认值: False
|
返回
| 类型 | 说明 |
|---|---|
|
列元数据听写的列表。 |