bcquality/microsoft/knowledge/performance/pass-var-record-to-preserve-partial-load-enumerator.md
Jesper Schulz-Wedde 42ff075793 Promote knowledge for Microsoft review skills
Move canonical knowledge for Microsoft-owned review domains into the Microsoft layer and document the skill/knowledge co-location policy.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2a6ea875-d38e-4f30-aadb-0d606f9be231
2026-09-03 14:59:44 +02:00

1.5 KiB

bc-version domain keywords technologies countries application-area
all
performance
setloadfields
jit-load
enumerator
var-parameter
pass-by-value
next
al
w1
all

Pass the iterated record var so a JIT load updates the enumerator

Contributions welcome — open a PR to refine or extend this article.

Description

A FindSet/Next loop builds an enumerator from the fields selected for load. Accessing an unloaded field triggers a JIT load. When the record is passed by value, the copy does not share that enumerator: the JIT loads the copy and leaves the enumerator unchanged, so every later Next() JIT-loads again. Passing var lets the first JIT update the enumerator. AddLoadFields on the original record before a by-value call is the other fix. This is independent of whether SetLoadFields was ordered before filters.

Best Practice

Helpers that read extra fields on an in-flight iterator must take the record as var, or the caller must AddLoadFields those fields before the loop. Prefer declaring the extra fields up front so no JIT is needed.

See sample: pass-var-record-to-preserve-partial-load-enumerator.good.al.

Anti Pattern

A SetLoadFields loop that passes the iterator by value into a helper which then reads a field that was not loaded. The first row pays one JIT; every subsequent row pays it again because the enumerator never learned the extra field.

See sample: pass-var-record-to-preserve-partial-load-enumerator.bad.al.