Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,7 @@ protected override Expression VisitConstant(ConstantExpression constant)
ExpressionSyntax GenerateValue(object? value)
=> value switch
{
int or long or uint or ulong or short or sbyte or ushort or byte or double or float or decimal
int or long or uint or ulong or short or sbyte or ushort or byte or double or float or decimal or char
=> (ExpressionSyntax)_g.LiteralExpression(constant.Value),

string or bool or null => (ExpressionSyntax)_g.LiteralExpression(constant.Value),
Expand Down
14 changes: 10 additions & 4 deletions src/EFCore/ChangeTracking/ListComparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,20 @@ public sealed class ListComparer<TElement> : ValueComparer<IEnumerable<TElement>
/// Creates a new instance of the list comparer.
/// </summary>
/// <param name="elementComparer">The comparer to use for comparing elements.</param>
public ListComparer(ValueComparer<TElement> elementComparer)
public ListComparer(ValueComparer elementComparer)
: base(
(a, b) => Compare(a, b, elementComparer),
o => GetHashCode(o, elementComparer),
source => Snapshot(source, elementComparer))
(a, b) => Compare(a, b, (ValueComparer<TElement>)elementComparer),
o => GetHashCode(o, (ValueComparer<TElement>)elementComparer),
source => Snapshot(source, (ValueComparer<TElement>)elementComparer))
{
ElementComparer = elementComparer;
}

/// <summary>
/// The comparer to use for comparing elements.
/// </summary>
public ValueComparer ElementComparer { get; }

/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
Expand Down
14 changes: 10 additions & 4 deletions src/EFCore/ChangeTracking/NullableValueTypeListComparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,20 @@ public sealed class NullableValueTypeListComparer<TElement> : ValueComparer<IEnu
/// Creates a new instance of the list comparer.
/// </summary>
/// <param name="elementComparer">The comparer to use for comparing elements.</param>
public NullableValueTypeListComparer(ValueComparer<TElement?> elementComparer)
public NullableValueTypeListComparer(ValueComparer elementComparer)
: base(
(a, b) => Compare(a, b, elementComparer),
o => GetHashCode(o, elementComparer),
source => Snapshot(source, elementComparer))
(a, b) => Compare(a, b, (ValueComparer<TElement?>)elementComparer),
o => GetHashCode(o, (ValueComparer<TElement?>)elementComparer),
source => Snapshot(source, (ValueComparer<TElement?>)elementComparer))
{
ElementComparer = elementComparer;
}

/// <summary>
/// The comparer to use for comparing elements.
/// </summary>
public ValueComparer ElementComparer { get; }

/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
Expand Down
6 changes: 6 additions & 0 deletions src/EFCore/ChangeTracking/ObjectListComparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,14 @@ public ObjectListComparer(ValueComparer elementComparer)
o => GetHashCode(o, elementComparer),
source => Snapshot(source, elementComparer))
{
ElementComparer = elementComparer;
}

/// <summary>
/// The comparer to use for comparing elements.
/// </summary>
public ValueComparer ElementComparer { get; }

/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
Expand Down
103 changes: 73 additions & 30 deletions src/EFCore/Design/Internal/CSharpRuntimeAnnotationCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -358,22 +358,43 @@ public static void Create(
ICSharpHelper codeHelper)
{
var mainBuilder = parameters.MainBuilder;
AddNamespace(typeof(ValueConverter<,>), parameters.Namespaces);
AddNamespace(converter.ModelClrType, parameters.Namespaces);
AddNamespace(converter.ProviderClrType, parameters.Namespaces);
var constructor = converter.GetType().GetDeclaredConstructor(new[] { typeof(JsonValueReaderWriter) });
var jsonReaderWriterProperty = converter.GetType().GetProperty(nameof(CollectionToJsonStringConverter<object>.JsonReaderWriter));
if (constructor == null
|| jsonReaderWriterProperty == null)
{
AddNamespace(typeof(ValueConverter<,>), parameters.Namespaces);
AddNamespace(converter.ModelClrType, parameters.Namespaces);
AddNamespace(converter.ProviderClrType, parameters.Namespaces);

mainBuilder
.Append("new ValueConverter<")
.Append(codeHelper.Reference(converter.ModelClrType))
.Append(", ")
.Append(codeHelper.Reference(converter.ProviderClrType))
.AppendLine(">(")
.IncrementIndent()
.Append(codeHelper.Expression(converter.ConvertToProviderExpression, parameters.Namespaces))
.AppendLine(",")
.Append(codeHelper.Expression(converter.ConvertFromProviderExpression, parameters.Namespaces))
.Append(")")
.DecrementIndent();
mainBuilder
.Append("new ValueConverter<")
.Append(codeHelper.Reference(converter.ModelClrType))
.Append(", ")
.Append(codeHelper.Reference(converter.ProviderClrType))
.AppendLine(">(")
.IncrementIndent()
.Append(codeHelper.Expression(converter.ConvertToProviderExpression, parameters.Namespaces))
.AppendLine(",")
.Append(codeHelper.Expression(converter.ConvertFromProviderExpression, parameters.Namespaces))
.Append(")")
.DecrementIndent();
}
else
{
AddNamespace(converter.GetType(), parameters.Namespaces);

mainBuilder
.Append("new ")
.Append(codeHelper.Reference(converter.GetType()))
.Append("(");

CreateJsonValueReaderWriter((JsonValueReaderWriter)jsonReaderWriterProperty.GetValue(converter)!, parameters, codeHelper);

mainBuilder
.Append(")")
.DecrementIndent();
}
}

/// <summary>
Expand All @@ -388,21 +409,43 @@ public static void Create(
ICSharpHelper codeHelper)
{
var mainBuilder = parameters.MainBuilder;
AddNamespace(typeof(ValueComparer<>), parameters.Namespaces);
AddNamespace(comparer.Type, parameters.Namespaces);

mainBuilder
.Append("new ValueComparer<")
.Append(codeHelper.Reference(comparer.Type))
.AppendLine(">(")
.IncrementIndent()
.AppendLines(codeHelper.Expression(comparer.EqualsExpression, parameters.Namespaces), skipFinalNewline: true)
.AppendLine(",")
.AppendLines(codeHelper.Expression(comparer.HashCodeExpression, parameters.Namespaces), skipFinalNewline: true)
.AppendLine(",")
.AppendLines(codeHelper.Expression(comparer.SnapshotExpression, parameters.Namespaces), skipFinalNewline: true)
.Append(")")
.DecrementIndent();
var constructor = comparer.GetType().GetDeclaredConstructor(new[] { typeof(ValueComparer) });
var elementComparerProperty = comparer.GetType().GetProperty(nameof(ListComparer<object>.ElementComparer));
if (constructor == null
|| elementComparerProperty == null)
{
AddNamespace(typeof(ValueComparer<>), parameters.Namespaces);
AddNamespace(comparer.Type, parameters.Namespaces);

mainBuilder
.Append("new ValueComparer<")
.Append(codeHelper.Reference(comparer.Type))
.AppendLine(">(")
.IncrementIndent()
.AppendLines(codeHelper.Expression(comparer.EqualsExpression, parameters.Namespaces), skipFinalNewline: true)
.AppendLine(",")
.AppendLines(codeHelper.Expression(comparer.HashCodeExpression, parameters.Namespaces), skipFinalNewline: true)
.AppendLine(",")
.AppendLines(codeHelper.Expression(comparer.SnapshotExpression, parameters.Namespaces), skipFinalNewline: true)
.Append(")")
.DecrementIndent();
}
else
{
AddNamespace(comparer.GetType(), parameters.Namespaces);

mainBuilder
.Append("new ")
.Append(codeHelper.Reference(comparer.GetType()))
.Append("(");

Create((ValueComparer)elementComparerProperty.GetValue(comparer)!, parameters, codeHelper);

mainBuilder
.Append(")")
.DecrementIndent();
}
}

/// <summary>
Expand Down Expand Up @@ -435,7 +478,7 @@ public static void CreateJsonValueReaderWriter(
.Append(")")
.DecrementIndent();
return;
}
}

if (jsonValueReaderWriter is ICompositeJsonValueReaderWriter compositeJsonValueReaderWriter)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,11 @@ public CollectionToJsonStringConverter(JsonValueReaderWriter collectionJsonReade
v => collectionJsonReaderWriter.ToJsonString(v),
v => (IEnumerable<TElement>)collectionJsonReaderWriter.FromJsonString(v, null))
{
JsonReaderWriter = collectionJsonReaderWriter;
}

/// <summary>
/// The reader/writer to use.
/// </summary>
public virtual JsonValueReaderWriter JsonReaderWriter { get; }
}
Loading