diff --git a/src/EFCore/Storage/Json/JsonConvertedValueReaderWriter.cs b/src/EFCore/Storage/Json/JsonConvertedValueReaderWriter.cs index 07ced68e630..b553c8c7652 100644 --- a/src/EFCore/Storage/Json/JsonConvertedValueReaderWriter.cs +++ b/src/EFCore/Storage/Json/JsonConvertedValueReaderWriter.cs @@ -16,6 +16,9 @@ public class JsonConvertedValueReaderWriter : JsonValueReaderWriter, IJsonConvertedValueReaderWriter { + private static readonly bool UseOldBehavior36856 = + AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue36856", out var enabled) && enabled; + private readonly JsonValueReaderWriter _providerReaderWriter; private readonly ValueConverter _converter; @@ -52,8 +55,17 @@ ValueConverter IJsonConvertedValueReaderWriter.Converter /// public override Expression ConstructorExpression - => Expression.New( - _constructorInfo, - ((ICompositeJsonValueReaderWriter)this).InnerReaderWriter.ConstructorExpression, - ((IJsonConvertedValueReaderWriter)this).Converter.ConstructorExpression); + => UseOldBehavior36856 + ? Expression.New( + _constructorInfo, + ((ICompositeJsonValueReaderWriter)this).InnerReaderWriter.ConstructorExpression, + ((IJsonConvertedValueReaderWriter)this).Converter.ConstructorExpression) + : Expression.New( + _constructorInfo, + ((ICompositeJsonValueReaderWriter)this).InnerReaderWriter.ConstructorExpression, + // We shouldn't quote converters, because it will create a new instance every time and + // it will have to compile the expression again and + // it will have a negative performance impact. See #36856 for more info. + // This means this is currently unsupported scenario for precompilation. + Expression.Constant(((IJsonConvertedValueReaderWriter)this).Converter)); }