LinqParsing - MetadataToken is insufficient to uniquely identify an expression method. #3060
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.
Appologies, I'm having trouble writing a Marten test to reproduce this as I have no control over what dotnet assignes for MetadataToken, however here are a couple of screengrabs from my project running against the latest (887afe7) codebase which is just after 7.3.0...
As you can see the IsDeleted and String compare methods in two different modules, Marten and System.Linq respectively, are getting the same hash code, and therefore LinqParsing.cs is caching the wrong value in the _methodParsers hash map.
Looking at the MS docs MetadataToken is only unique per module, and therefore I think the cache key needs to be changed..
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.memberinfo.metadatatoken?view=net-8.0
Here is an example from local execution of my codebase with Marten integrated, where MaybeDeletedParser is being returned for a string comparison:
Output:
Another repro path output:
Note I see "100665670" twice for two different methods