Skip to content

Commit 9d2ad57

Browse files
tpellissierclaude
andcommitted
Fix QueryBuilder execute() examples to use flat iteration
execute() returns flat records by default, not pages. Update all docstring and README examples to iterate records directly instead of the incorrect nested for-page/for-record pattern. Page-level iteration requires execute(by_page=True). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 503a47c commit 9d2ad57

2 files changed

Lines changed: 41 additions & 47 deletions

File tree

README.md

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -239,16 +239,15 @@ The **QueryBuilder** is the recommended way to query records. It provides a flue
239239

240240
```python
241241
# Fluent query builder (recommended)
242-
for page in (client.query.builder("account")
243-
.select("name", "revenue")
244-
.filter_eq("statecode", 0)
245-
.filter_gt("revenue", 1000000)
246-
.order_by("revenue", descending=True)
247-
.top(100)
248-
.page_size(50)
249-
.execute()):
250-
for record in page:
251-
print(f"{record['name']}: {record['revenue']}")
242+
for record in (client.query.builder("account")
243+
.select("name", "revenue")
244+
.filter_eq("statecode", 0)
245+
.filter_gt("revenue", 1000000)
246+
.order_by("revenue", descending=True)
247+
.top(100)
248+
.page_size(50)
249+
.execute()):
250+
print(f"{record['name']}: {record['revenue']}")
252251
```
253252

254253
The QueryBuilder handles value formatting, column name casing, and OData syntax automatically. All filter methods are discoverable via IDE autocomplete:
@@ -271,21 +270,19 @@ For complex logic (OR, NOT, grouping), use the composable expression tree with `
271270
from PowerPlatform.Dataverse.models.filters import eq, gt, filter_in, between
272271

273272
# OR conditions: (statecode = 0 OR statecode = 1) AND revenue > 100k
274-
for page in (client.query.builder("account")
275-
.select("name", "revenue")
276-
.where((eq("statecode", 0) | eq("statecode", 1))
277-
& gt("revenue", 100000))
278-
.execute()):
279-
for record in page:
280-
print(record["name"])
273+
for record in (client.query.builder("account")
274+
.select("name", "revenue")
275+
.where((eq("statecode", 0) | eq("statecode", 1))
276+
& gt("revenue", 100000))
277+
.execute()):
278+
print(record["name"])
281279

282280
# NOT, between, and in operators
283-
for page in (client.query.builder("account")
284-
.where(~eq("statecode", 2)) # NOT inactive
285-
.where(between("revenue", 100000, 500000)) # revenue in range
286-
.execute()):
287-
for record in page:
288-
print(record["name"])
281+
for record in (client.query.builder("account")
282+
.where(~eq("statecode", 2)) # NOT inactive
283+
.where(between("revenue", 100000, 500000)) # revenue in range
284+
.execute()):
285+
print(record["name"])
289286
```
290287

291288
**SQL queries** provide an alternative read-only query syntax:

src/PowerPlatform/Dataverse/operations/query.py

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,13 @@ class QueryOperations:
3232
client = DataverseClient(base_url, credential)
3333
3434
# Fluent query builder (recommended)
35-
for page in (client.query.builder("account")
36-
.select("name", "revenue")
37-
.filter_eq("statecode", 0)
38-
.order_by("revenue", descending=True)
39-
.top(100)
40-
.execute()):
41-
for record in page:
42-
print(record["name"])
35+
for record in (client.query.builder("account")
36+
.select("name", "revenue")
37+
.filter_eq("statecode", 0)
38+
.order_by("revenue", descending=True)
39+
.top(100)
40+
.execute()):
41+
print(record["name"])
4342
4443
# SQL query
4544
rows = client.query.sql("SELECT TOP 10 name FROM account ORDER BY name")
@@ -67,27 +66,25 @@ def builder(self, table: str) -> QueryBuilder:
6766
Example:
6867
Build and execute a query fluently::
6968
70-
for page in (client.query.builder("account")
71-
.select("name", "revenue")
72-
.filter_eq("statecode", 0)
73-
.filter_gt("revenue", 1000000)
74-
.order_by("revenue", descending=True)
75-
.top(100)
76-
.page_size(50)
77-
.execute()):
78-
for record in page:
79-
print(record["name"])
69+
for record in (client.query.builder("account")
70+
.select("name", "revenue")
71+
.filter_eq("statecode", 0)
72+
.filter_gt("revenue", 1000000)
73+
.order_by("revenue", descending=True)
74+
.top(100)
75+
.page_size(50)
76+
.execute()):
77+
print(record["name"])
8078
8179
With composable expression tree::
8280
8381
from PowerPlatform.Dataverse.models.filters import eq, gt
8482
85-
for page in (client.query.builder("account")
86-
.where((eq("statecode", 0) | eq("statecode", 1))
87-
& gt("revenue", 100000))
88-
.execute()):
89-
for record in page:
90-
print(record["name"])
83+
for record in (client.query.builder("account")
84+
.where((eq("statecode", 0) | eq("statecode", 1))
85+
& gt("revenue", 100000))
86+
.execute()):
87+
print(record["name"])
9188
"""
9289
qb = QueryBuilder(table)
9390
qb._query_ops = self

0 commit comments

Comments
 (0)