diff --git a/src/EFCore.PG/Internal/EnumerableMethods.cs b/src/EFCore.PG/Internal/EnumerableMethods.cs index 3d86265345..de3799fa17 100644 --- a/src/EFCore.PG/Internal/EnumerableMethods.cs +++ b/src/EFCore.PG/Internal/EnumerableMethods.cs @@ -10,7 +10,7 @@ internal static class EnumerableMethods public static MethodInfo All { get; } - // public static MethodInfo AnyWithoutPredicate { get; } + public static MethodInfo AnyWithoutPredicate { get; } public static MethodInfo AnyWithPredicate { get; } @@ -259,8 +259,9 @@ static EnumerableMethods() nameof(Enumerable.All), 1, types => [typeof(IEnumerable<>).MakeGenericType(types[0]), typeof(Func<,>).MakeGenericType(types[0], typeof(bool))]); - // AnyWithoutPredicate = GetMethod(nameof(Enumerable.Any), 1, - // types => new[] { typeof(IEnumerable<>).MakeGenericType(types[0]) }); + AnyWithoutPredicate = GetMethod( + nameof(Enumerable.Any), 1, + types => [typeof(IEnumerable<>).MakeGenericType(types[0])]); AnyWithPredicate = GetMethod( nameof(Enumerable.Any), 1, diff --git a/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlByteArrayMethodTranslator.cs b/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlByteArrayMethodTranslator.cs index 4a6a226593..d16b608c45 100644 --- a/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlByteArrayMethodTranslator.cs +++ b/src/EFCore.PG/Query/ExpressionTranslators/Internal/NpgsqlByteArrayMethodTranslator.cs @@ -79,6 +79,18 @@ public NpgsqlByteArrayMethodTranslator(ISqlExpressionFactory sqlExpressionFactor _sqlExpressionFactory.Constant(0)); } + if (method.GetGenericMethodDefinition().Equals(EnumerableMethods.AnyWithoutPredicate)) + { + return _sqlExpressionFactory.GreaterThan( + _sqlExpressionFactory.Function( + "length", + [arguments[0]], + nullable: true, + argumentsPropagateNullability: TrueArrays[1], + typeof(int)), + _sqlExpressionFactory.Constant(0)); + } + if (method.GetGenericMethodDefinition().Equals(EnumerableMethods.FirstWithoutPredicate)) { return _sqlExpressionFactory.Convert( diff --git a/test/EFCore.PG.FunctionalTests/Query/Translations/ByteArrayTranslationsNpgsqlTest.cs b/test/EFCore.PG.FunctionalTests/Query/Translations/ByteArrayTranslationsNpgsqlTest.cs index c280c208d6..5ccd996d0e 100644 --- a/test/EFCore.PG.FunctionalTests/Query/Translations/ByteArrayTranslationsNpgsqlTest.cs +++ b/test/EFCore.PG.FunctionalTests/Query/Translations/ByteArrayTranslationsNpgsqlTest.cs @@ -1,3 +1,5 @@ +using Microsoft.EntityFrameworkCore.TestModels.BasicTypesModel; + namespace Microsoft.EntityFrameworkCore.Query.Translations; public class ByteArrayTranslationsNpgsqlTest : ByteArrayTranslationsTestBase @@ -98,6 +100,19 @@ public override async Task SequenceEqual() """); } + [ConditionalFact] + public virtual async Task Any() + { + await AssertQuery(ss => ss.Set().Where(e => e.ByteArray.Any())); + + AssertSql( +""" +SELECT b."Id", b."Bool", b."Byte", b."ByteArray", b."DateOnly", b."DateTime", b."DateTimeOffset", b."Decimal", b."Double", b."Enum", b."FlagsEnum", b."Float", b."Guid", b."Int", b."Long", b."Short", b."String", b."TimeOnly", b."TimeSpan" +FROM "BasicTypesEntities" AS b +WHERE length(b."ByteArray") > 0 +"""); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); }