Add NodaTime Instant serialization for LINQ Select. Closes GH-2866 #3949
+181
−19
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
Instantis 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
Instantformat depends on how the data is read:Instantis read as a part of a parent object e.g.session.Query<ParentObj>().SingleAsync(p => p.Id = fooId)then thejsonbis read as is and theInstantproperty is formatted as anExtendedIsostring - not an issueInstantis read by using LINQSelectto project only specific properties from thedatacolumn (e.g.session.Query<ParentObj>().Select(p => new { p.Id, p.InstantProp }).SingleAsync()), in the SQL SELECT statement, the properties are cast to theNpgsqltype the property type maps to.Instantmaps totimestamp with time zoneand when the cast is performed, the format contains the+00:00offset at the end instead of theZ, so the deserialization attempt with theExtendedIsoformat failsI've added the
InstantJsonConverterfor both STJ and Newtonsoft which tries the alternate format deserialization if theExtendedIsodeserialization fails, and have registered it as the Instant converter instead of the defaultNodaPatternConverter<Instant>whenUseNodaTimeis called.This shouldn't be a breaking change, but I've made the
InstantJsonConverterpublic to make it easier to remove and replace with a custom converter when needed.Let me know if you think making it
internalis the better decision choice.