Add NodaTime Instant serialization for LINQ Select. Closes GH-2866 #3949
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #2866
When using default NodaTime serialization, the
Instant
is serialized using theExtendedIso
(uuuu'-'MM'-'dd'T'HH':'mm':'ss;FFFFFFFFF'Z'
) format and is saved as such to the data jsonb column.But when the data is read and deserialized the
Instant
format depends on how the data is read:Instant
is read as a part of a parent object e.g.session.Query<ParentObj>().SingleAsync(p => p.Id = fooId)
then thejsonb
is read as is and theInstant
property is formatted as anExtendedIso
string - not an issueInstant
is read by using LINQSelect
to project only specific properties from thedata
column (e.g.session.Query<ParentObj>().Select(p => new { p.Id, p.InstantProp }).SingleAsync()
), in the SQL SELECT statement, the properties are cast to theNpgsql
type the property type maps to.Instant
maps totimestamp with time zone
and when the cast is performed, the format contains the+00:00
offset at the end instead of theZ
, so the deserialization attempt with theExtendedIso
format failsI've added the
InstantJsonConverter
for both STJ and Newtonsoft which tries the alternate format deserialization if theExtendedIso
deserialization fails, and have registered it as the Instant converter instead of the defaultNodaPatternConverter<Instant>
whenUseNodaTime
is called.This shouldn't be a breaking change, but I've made the
InstantJsonConverter
public to make it easier to remove and replace with a custom converter when needed.Let me know if you think making it
internal
is the better decision choice.