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 または execute_pages が呼び出されるまで、HTTP 要求は行われません。

OData ビルダー エンドポイントで表現できない SQL-JOIN シナリオ、集計クエリ、またはその他の操作に使用します。

例:


   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:
   #   {"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

あるテーブルから別のテーブルに $expand するナビゲーション プロパティ名を返します。

リレーションシップ メタデータを使用して検出します。 expand= パラメーターの正確な PascalCase 文字列を返します。

例:


   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 で使用できる列の簡略化された一覧を返します。

各 dict には、 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 または execute_pages が呼び出されるまで、HTTP 要求は行われません。

OData ビルダー エンドポイントで表現できない SQL-JOIN シナリオ、集計クエリ、またはその他の操作に使用します。

例:


   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()メソッドを含む不活性クエリ オブジェクト。

例外

説明

FetchXML にルート <entity> 要素またはエンティティ name 属性がない場合。

odata_bind

ルックアップ フィールドを設定するための @odata.bind エントリを作成します。

メタデータからナビゲーション プロパティ名とエンティティ セット名を自動検出します。 作成または更新のペイロードにマージできる単一エントリのディクテーションを返します。

例:


   # 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]

パラメーター

名前 説明
from_table
必須
str

作成または更新されるエンティティのスキーマ名。

to_table
必須
str

参照先のターゲット エンティティのスキーマ名。

target_id
必須
str

ターゲット レコードの GUID。

返品

説明

{"NavProp@odata.bind": "/entityset(guid)"}のようなディクテーション。

例外

説明

テーブル間にリレーションシップが見つからない場合。

odata_expand

あるテーブルから別のテーブルに $expand するナビゲーション プロパティ名を返します。

リレーションシップ メタデータを使用して検出します。 expand= パラメーターの正確な PascalCase 文字列を返します。

例:


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

集計を使用した JOIN:


   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 で使用できる列の簡略化された一覧を返します。

各 dict には、 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 (既定) の場合、共通のシステム サフィックス (_baseversionnumbertimezoneruleversionnumberutcconversiontimezonecodeimportsequencenumberoverriddencreatedon) で終わる列は除外されます。

キーワードのみのパラメーター

名前 説明
include_system
規定値: False

返品

説明

列メタデータ のディクテーションの一覧。