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"])

构造函数

QueryOperations(client: DataverseClient)

参数

名称 说明
client
必需

DataverseClient 实例。

方法

builder

为指定的表创建 Fluent 查询生成器。

返回一个 QueryBuilder 可以链接的筛选器、选择和排序方法,然后直接通过 .execute()

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())
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_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_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_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)
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_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']}")

builder

为指定的表创建 Fluent 查询生成器。

返回一个 QueryBuilder 可以链接的筛选器、选择和排序方法,然后直接通过 .execute()

builder(table: str) -> QueryBuilder

参数

名称 说明
table
必需
str

表架构名称(例如 "account")。

返回

类型 说明

绑定到此客户端的 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
必需
str

格式正确的 FetchXML 查询字符串。 根 <entity name="..."> 元素确定实体集终结点。

返回

类型 说明

具有 .execute().execute_pages() 方法的 Inert 查询对象。

例外

类型 说明

如果 FetchXML 缺少根 <entity> 元素或实体 name 属性。

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
必需
str

正在创建/更新的实体的架构名称。

to_table
必需
str

查找指向的目标实体的架构名称。

target_id
必需
str

目标记录的 GUID。

返回

类型 说明

一个像 {"[email protected]": "/entityset(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
必需
str

源表的架构名称(例如 "contact")。

to_table
必需
str

目标表的架构名称(例如 "account")。

返回

类型 说明
str

导航属性名称(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
必需
str

表的架构名称(例如 "contact")。

返回

类型 说明

听写列表,每个听写都有:

  • nav_property – $expand的 PascalCase 导航属性

  • target_table – 目标实体逻辑名称

  • target_entity_set – 目标实体集 (for @odata.bind)

  • lookup_attribute – 查找列逻辑名称

  • relationship – 关系架构名称

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
必需
str

表的架构名称(例如 "account")。

include_system
必需

包括系统列(默认值 False)。

仅限关键字的参数

名称 说明
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
必需
str

支持的 SQL SELECT 语句。

返回

类型 说明

Record对象列表。 如果没有行匹配,则返回空列表。

例外

类型 说明

如果 sql 不是字符串或为空。

示例

基本查询:


   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
必需
str

表的架构名称(例如 "account")。

include_system
必需

如果 False (默认值),则排除以通用系统后缀结尾的列(_basetimezoneruleversionnumberversionnumberutcconversiontimezonecode、、importsequencenumberoverriddencreatedon

仅限关键字的参数

名称 说明
include_system
默认值: False

返回

类型 说明

列元数据听写的列表。