You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Typed column metadata reads via RetrieveMetadataChanges (one request, no @odata.type cast round-trip) #203
Reading type-specific column properties over /EntityDefinitions is a two-step dance: first read the generic attribute to get AttributeType/@odata.type, then re-issue a second GET with a derived-type URL cast (/Attributes/Microsoft.Dynamics.CRM.StringAttributeMetadata) to project the typed fields. The SDK does exactly this today (e.g. _bulk_fetch_picklists, extra_select="@odata.type,AttributeType").
Context: what the .NET modern client gives for free
ServiceClient gets fully-typed, polymorphic AttributeMetadata derived objects back in oneRetrieveEntity/RetrieveAllEntities call and the caller just downcasts (attr is StringAttributeMetadata s). No second request, no discriminator juggling.
Proposed change
Add a typed read path backed by the Web API RetrieveMetadataChanges function -- the closest Web-API analog to the .NET single-request typed retrieve. It returns derived typed attributes in one call and supports property projection (via the query's AttributeQuery.Properties), so callers get small, typed payloads without the cast round-trip.
cols=client.tables.list_columns("account", typed=True) # typed values, one requestcol=client.tables.get_column("account", "emailaddress1", typed=True)
Why this does not need a platform change
Payload size is controlled by the query's property projection, so the platform "omit null fields" ask is not a blocker -- we simply project only the properties we need. (Note: the .NET client itself uses plain Retrieve* + a client cache rather than RetrieveMetadataChanges; for a Web-API client wanting small typed payloads, RetrieveMetadataChanges with projection is the better fit. Design discussion welcome.)
Touchpoints
data/_odata.py -- new _retrieve_metadata_changes(...) issuing GET RetrieveMetadataChanges(Query=@p1)?@p1={...} with an EntityQueryExpression + AttributeQuery.Properties projection.
operations/tables.py + async twin -- typed=True on list_columns / get_column (keep the existing cast path as fallback).
Unit tests: request shape (projection, criteria) + typed mapping.
README + CHANGELOG.
Acceptance
list_columns(typed=True) returns typed values (e.g. MaxLength on string/memo, MinValue/MaxValue on int) in a single request, no @odata.type URL cast.
Property projection limits the payload to requested properties.
Activity