From 10f3dacb06791e01a5a468970c5beab780869ec7 Mon Sep 17 00:00:00 2001 From: "steven.darby" Date: Sun, 14 Nov 2021 22:18:07 +0000 Subject: [PATCH] Use EqualsExact in DefaultDateTimeOffsetValueComparer Fixes #26672 --- src/EFCore/ChangeTracking/ValueComparer.cs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/EFCore/ChangeTracking/ValueComparer.cs b/src/EFCore/ChangeTracking/ValueComparer.cs index 442d339ca33..147ee816ee3 100644 --- a/src/EFCore/ChangeTracking/ValueComparer.cs +++ b/src/EFCore/ChangeTracking/ValueComparer.cs @@ -278,21 +278,18 @@ public override Expression ExtractEqualsBody(Expression leftExpression, Expressi internal sealed class DefaultDateTimeOffsetValueComparer : DefaultValueComparer { - private static readonly PropertyInfo _offsetPropertyInfo = typeof(DateTimeOffset).GetProperty(nameof(DateTimeOffset.Offset))!; + private static readonly MethodInfo _equalsExactMethodInfo + = typeof(DateTimeOffset).GetRequiredRuntimeMethod(nameof(DateTimeOffset.EqualsExact), typeof(DateTimeOffset)); // In .NET, two DateTimeOffset instances are considered equal if they represent the same point in time but with different - // time zone offsets. This comparer considers such DateTimeOffset as non-equal. + // time zone offsets. This comparer uses EqualsExact, which considers such DateTimeOffset as non-equal. public DefaultDateTimeOffsetValueComparer(bool favorStructuralComparisons) - : base((v1, v2) => v1 == v2 && v1.Offset == v2.Offset, favorStructuralComparisons) + : base((v1, v2) => v1.EqualsExact(v2), favorStructuralComparisons) { } public override Expression ExtractEqualsBody(Expression leftExpression, Expression rightExpression) - => Expression.And( - Expression.Equal(leftExpression, rightExpression), - Expression.Equal( - Expression.Property(leftExpression, _offsetPropertyInfo), - Expression.Property(rightExpression, _offsetPropertyInfo))); + => Expression.Call(leftExpression, _equalsExactMethodInfo, rightExpression); } } }