diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b0c42ff..65dff82 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -80,6 +80,7 @@ jobs: with: dotnet-version: | 8.0.x + 9.0.x - uses: dotnet/nbgv@master id: nbgv diff --git a/Directory.Build.props b/Directory.Build.props index 30b95cb..ae087fd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -16,8 +16,6 @@ True true - $(DefineConstants);EF_CORE_8 - $(NoWarn);SA1633 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index dd51557..946f4c7 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -35,6 +35,7 @@ + diff --git a/src/Zomp.EFCore.BinaryFunctions.Npgsql/Query/Internal/NpgsqlBinaryTranslator.cs b/src/Zomp.EFCore.BinaryFunctions.Npgsql/Query/Internal/NpgsqlBinaryTranslator.cs index d6ef9d8..521f797 100644 --- a/src/Zomp.EFCore.BinaryFunctions.Npgsql/Query/Internal/NpgsqlBinaryTranslator.cs +++ b/src/Zomp.EFCore.BinaryFunctions.Npgsql/Query/Internal/NpgsqlBinaryTranslator.cs @@ -50,9 +50,15 @@ protected override SqlExpression GetBytes(SqlExpression sqlExpression) } // Every byte is two characters in hex, thus multiply by 2 +#if !EF_CORE_8 + var byteSize = new SqlConstantExpression(sizeOfType * 2, null); + var zero = new SqlConstantExpression("0", null); + var hex = new SqlConstantExpression("hex", null); +#else var byteSize = new SqlConstantExpression(Expression.Constant(sizeOfType * 2), null); var zero = new SqlConstantExpression(Expression.Constant("0"), null); var hex = new SqlConstantExpression(Expression.Constant("hex"), null); +#endif var lPad = sqlExpressionFactory.Function("LPAD", [toHex, byteSize, zero], true, LPadArgumentsPropagateNullability, typeof(string)); var decode = sqlExpressionFactory.Function("decode", [lPad, hex], true, DecodeArgumentsPropagateNullabilityArray, typeof(string), byteArrayTypeMapping); return new SqlUnaryExpression(ExpressionType.Convert, decode, typeof(byte[]), byteArrayTypeMapping); diff --git a/src/Zomp.EFCore.BinaryFunctions.SqlServer/Infrastructure/Internal/SqlServerBinaryTranslator.cs b/src/Zomp.EFCore.BinaryFunctions.SqlServer/Infrastructure/Internal/SqlServerBinaryTranslator.cs index 19486ea..5ec7e1d 100644 --- a/src/Zomp.EFCore.BinaryFunctions.SqlServer/Infrastructure/Internal/SqlServerBinaryTranslator.cs +++ b/src/Zomp.EFCore.BinaryFunctions.SqlServer/Infrastructure/Internal/SqlServerBinaryTranslator.cs @@ -15,9 +15,16 @@ public class SqlServerBinaryTranslator(ISqlExpressionFactory sqlExpressionFactor // Constants private static readonly double TwoToThePowerOfMinus52 = Math.Pow(2d, -52); + +#if !EF_CORE_8 + private static readonly SqlExpression TwoToThePowerOfMinus52Sql = new SqlConstantExpression(TwoToThePowerOfMinus52, null); + private static readonly SqlExpression OneFloat = new SqlConstantExpression(1d, null); + private static readonly SqlExpression TwoFloat = new SqlConstantExpression(2d, null); +#else private static readonly SqlExpression TwoToThePowerOfMinus52Sql = new SqlConstantExpression(Expression.Constant(TwoToThePowerOfMinus52), null); private static readonly SqlExpression OneFloat = new SqlConstantExpression(Expression.Constant(1d), null); private static readonly SqlExpression TwoFloat = new SqlConstantExpression(Expression.Constant(2d), null); +#endif // Must be varbinary. private static readonly SqlExpression X000FFFFFFFFFFFFF = new SqlFragmentExpression("0x000FFFFFFFFFFFFF"); @@ -51,7 +58,11 @@ private SqlBinaryExpression ToDouble(SqlExpression sqlExpression) { var colNameBigInt = new SqlUnaryExpression(ExpressionType.Convert, sqlExpression, typeof(long), null); +#if !EF_CORE_8 + var sql1023 = new SqlConstantExpression(1023, null); +#else var sql1023 = new SqlConstantExpression(Expression.Constant(1023), null); +#endif // Line 1 var l1 = sqlExpressionFactory.Function("SIGN", [colNameBigInt], true, SignArgumentsPropagateNullability, colNameBigInt.Type); diff --git a/src/Zomp.EFCore.BinaryFunctions.Sqlite/Query/Internal/SqliteBinaryTranslator.cs b/src/Zomp.EFCore.BinaryFunctions.Sqlite/Query/Internal/SqliteBinaryTranslator.cs index 97af780..ecfb17a 100644 --- a/src/Zomp.EFCore.BinaryFunctions.Sqlite/Query/Internal/SqliteBinaryTranslator.cs +++ b/src/Zomp.EFCore.BinaryFunctions.Sqlite/Query/Internal/SqliteBinaryTranslator.cs @@ -26,8 +26,13 @@ protected override SqlExpression BinaryCast(SqlExpression sqlExpression, Type to var maxValue = 1L << (sizeInBytes * 8); var maxValueSigned = 1L << ((sizeInBytes * 8) - 1); +#if !EF_CORE_8 + var maxValueSql = new SqlConstantExpression(maxValue, null); + var maxValueSignedSql = new SqlConstantExpression(maxValueSigned, null); +#else var maxValueSql = new SqlConstantExpression(Expression.Constant(maxValue), null); var maxValueSignedSql = new SqlConstantExpression(Expression.Constant(maxValueSigned), null); +#endif // Equivalent of substring on binary data var modResult = new SqlBinaryExpression(ExpressionType.Modulo, sqlExpression, maxValueSql, fromType, null); diff --git a/src/Zomp.EFCore.BinaryFunctions/Query/Internal/BinaryTranslator.cs b/src/Zomp.EFCore.BinaryFunctions/Query/Internal/BinaryTranslator.cs index c9a3feb..318eb32 100644 --- a/src/Zomp.EFCore.BinaryFunctions/Query/Internal/BinaryTranslator.cs +++ b/src/Zomp.EFCore.BinaryFunctions/Query/Internal/BinaryTranslator.cs @@ -83,10 +83,23 @@ private static SqlBinaryExpression Concat(IReadOnlyList arguments private SqlExpression ToValue(SqlExpression sqlExpression, SqlExpression offset, Type type) => ToValue( - Substring(sqlExpression, offset, new SqlConstantExpression(Expression.Constant(Marshal.SizeOf(type)), null)), + Substring( + sqlExpression, + offset, +#if !EF_CORE_8 + new SqlConstantExpression(Marshal.SizeOf(type), null)), +#else + new SqlConstantExpression(Expression.Constant(Marshal.SizeOf(type)), null)), +#endif type); - private SqlFunctionExpression Substring(SqlExpression bytearray, SqlExpression start, SqlExpression length) => sqlExpressionFactory.Function( + private +#if !EF_CORE_8 + SqlExpression +#else + SqlFunctionExpression +#endif + Substring(SqlExpression bytearray, SqlExpression start, SqlExpression length) => sqlExpressionFactory.Function( "SUBSTRING", [ bytearray, diff --git a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessor.cs b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessor.cs index bdecf53..443a7f8 100644 --- a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessor.cs @@ -6,14 +6,41 @@ /// /// Initializes a new instance of the class. /// -/// Service dependencies. -/// A bool value indicating if relational nulls should be used. -public class WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) - : NpgsqlParameterBasedSqlProcessor(dependencies, useRelationalNulls) +public class WindowFunctionsNpgsqlParameterBasedSqlProcessor : NpgsqlParameterBasedSqlProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Service dependencies. + /// Processor parameters. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Service dependencies. + /// A bool value indicating if relational nulls should be used. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + { + } +#endif + +#if !EF_CORE_8 + /// + protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) + => new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, Parameters) + .Process(selectExpression, parametersValues, out canCache); +#else /// protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) => new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(selectExpression, parametersValues, out canCache); - ////protected override Expression ProcessSqlNullability(Expression queryExpression, IReadOnlyDictionary parametersValues, out bool canCache) - //// => new WindowFunctionsNpgsqlSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(queryExpression, parametersValues, out canCache); -} \ No newline at end of file +#endif + +} diff --git a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory.cs b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory.cs index 21e938c..bf9a3ac 100644 --- a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory.cs +++ b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory.cs @@ -6,13 +6,45 @@ /// /// Initializes a new instance of the class. /// -/// Relational Parameter Based Sql ProcessorDependencies. -public class WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies) - : NpgsqlParameterBasedSqlProcessorFactory(dependencies) +public class WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory : NpgsqlParameterBasedSqlProcessorFactory { - private readonly RelationalParameterBasedSqlProcessorDependencies dependencies = dependencies; + private readonly RelationalParameterBasedSqlProcessorDependencies dependencies; +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql ProcessorDependencies. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies) + : base(dependencies) + { + this.dependencies = dependencies; + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql ProcessorDependencies. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies) + : base(dependencies) + { + this.dependencies = dependencies; + } +#endif + +#if !EF_CORE_8 + /// + /// This will be removed. + /// + /// Processor parameters. + /// This will be removed soon. + public new RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters) + => new WindowFunctionsNpgsqlParameterBasedSqlProcessor(dependencies, parameters); +#else /// public override RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls) => new WindowFunctionsNpgsqlParameterBasedSqlProcessor(dependencies, useRelationalNulls); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor.cs b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor.cs index 75367db..d272af2 100644 --- a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor.cs @@ -3,11 +3,39 @@ /// /// The WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor. /// -/// Type mapping source dependencies. -/// Relational type mapping source dependencies. -/// The query compilation context object to use. -public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext) : NpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext) +public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor : NpgsqlQueryableMethodTranslatingExpressionVisitor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Type mapping source dependencies. + /// Relational type mapping source dependencies. + /// The query compilation context object to use. + /// NpgSql Singleton Options. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor( + QueryableMethodTranslatingExpressionVisitorDependencies dependencies, + RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, + RelationalQueryCompilationContext queryCompilationContext, + INpgsqlSingletonOptions npgsqlSingletonOptions) + : base(dependencies, relationalDependencies, queryCompilationContext, npgsqlSingletonOptions) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Type mapping source dependencies. + /// Relational type mapping source dependencies. + /// The query compilation context object to use. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext) + : base(dependencies, relationalDependencies, queryCompilationContext) + { + } +#endif + /// protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) => SubQueryProcessor.ProcessSubQuery(this, methodCallExpression) ?? base.VisitMethodCall(methodCallExpression); diff --git a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory.cs b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory.cs index c819955..788eba0 100644 --- a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory.cs +++ b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory.cs @@ -3,15 +3,54 @@ /// /// The WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory. /// -/// Type mapping source dependencies. -/// Relational type mapping source dependencies. -public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies) - : NpgsqlQueryableMethodTranslatingExpressionVisitorFactory(dependencies, relationalDependencies) +public class WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory : NpgsqlQueryableMethodTranslatingExpressionVisitorFactory { - private readonly QueryableMethodTranslatingExpressionVisitorDependencies dependencies = dependencies; - private readonly RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies = relationalDependencies; + private readonly QueryableMethodTranslatingExpressionVisitorDependencies dependencies; + private readonly RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies; +#if !EF_CORE_8 + private readonly INpgsqlSingletonOptions npgsqlSingletonOptions; +#endif +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Type mapping source dependencies. + /// Relational type mapping source dependencies. + /// NpgSql Singleton Options. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory( + QueryableMethodTranslatingExpressionVisitorDependencies dependencies, + RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, + INpgsqlSingletonOptions npgsqlSingletonOptions) + : base(dependencies, relationalDependencies, npgsqlSingletonOptions) + { + this.dependencies = dependencies; + this.relationalDependencies = relationalDependencies; + this.npgsqlSingletonOptions = npgsqlSingletonOptions; + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Type mapping source dependencies. + /// Relational type mapping source dependencies. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitorFactory(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + this.dependencies = dependencies; + this.relationalDependencies = relationalDependencies; + } +#endif + +#if !EF_CORE_8 + /// + public override QueryableMethodTranslatingExpressionVisitor Create(QueryCompilationContext queryCompilationContext) + => new WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, (RelationalQueryCompilationContext)queryCompilationContext, npgsqlSingletonOptions); +#else /// public override QueryableMethodTranslatingExpressionVisitor Create(QueryCompilationContext queryCompilationContext) => new WindowFunctionsNpgsqlQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlSqlNullabilityProcessor.cs b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlSqlNullabilityProcessor.cs index 00fb5dc..c98cb1f 100644 --- a/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlSqlNullabilityProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Npgsql/Query/Internal/WindowFunctionsNpgsqlSqlNullabilityProcessor.cs @@ -6,11 +6,32 @@ /// /// Initializes a new instance of the class. /// -/// Relational Parameter Based Sql Processor Dependencies. -/// A bool value indicating if relational nulls should be used. -public class WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) - : NpgsqlSqlNullabilityProcessor(dependencies, useRelationalNulls) +public class WindowFunctionsNpgsqlSqlNullabilityProcessor : NpgsqlSqlNullabilityProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// Processor parameters. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// A bool value indicating if relational nulls should be used. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsNpgsqlSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + { + } +#endif + /// protected override SqlExpression VisitCustomSqlExpression(SqlExpression sqlExpression, bool allowOptimizedExpansion, out bool nullable) { diff --git a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessor.cs b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessor.cs index 928c738..84bc128 100644 --- a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessor.cs @@ -6,6 +6,17 @@ [System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "Multiple versions")] public class WindowFunctionsSqlServerParameterBasedSqlProcessor : SqlServerParameterBasedSqlProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Service dependencies. + /// Processor parameters. + public WindowFunctionsSqlServerParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else /// /// Initializes a new instance of the class. /// @@ -15,9 +26,17 @@ public WindowFunctionsSqlServerParameterBasedSqlProcessor(RelationalParameterBas : base(dependencies, useRelationalNulls) { } +#endif +#if !EF_CORE_8 + /// + protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) + => new WindowFunctionsSqlServerSqlNullabilityProcessor(Dependencies, Parameters).Process( + selectExpression, parametersValues, out canCache); +#else /// protected override Expression ProcessSqlNullability(Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) => new WindowFunctionsSqlServerSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process( selectExpression, parametersValues, out canCache); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessorFactory.cs b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessorFactory.cs index 4acf526..6d9678f 100644 --- a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessorFactory.cs +++ b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerParameterBasedSqlProcessorFactory.cs @@ -10,7 +10,13 @@ public class WindowFunctionsSqlServerParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies) : SqlServerParameterBasedSqlProcessorFactory(dependencies) { +#if !EF_CORE_8 + /// + public override RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters) + => new WindowFunctionsSqlServerParameterBasedSqlProcessor(Dependencies, parameters); +#else /// public override RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls) => new WindowFunctionsSqlServerParameterBasedSqlProcessor(Dependencies, useRelationalNulls); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerSqlNullabilityProcessor.cs b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerSqlNullabilityProcessor.cs index cb14c6d..aae8af5 100644 --- a/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerSqlNullabilityProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.SqlServer/Query/Internal/WindowFunctionsSqlServerSqlNullabilityProcessor.cs @@ -6,11 +6,32 @@ /// /// Initializes a new instance of the class. /// -/// Relational Parameter Based Sql Processor Dependencies. -/// A bool value indicating if relational nulls should be used. -public class WindowFunctionsSqlServerSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) - : SqlServerSqlNullabilityProcessor(dependencies, useRelationalNulls) +public class WindowFunctionsSqlServerSqlNullabilityProcessor : SqlServerSqlNullabilityProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// Processor parameters. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqlServerSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// A bool value indicating if relational nulls should be used. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqlServerSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + { + } +#endif + /// protected override SqlExpression VisitCustomSqlExpression(SqlExpression sqlExpression, bool allowOptimizedExpansion, out bool nullable) { diff --git a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessor.cs b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessor.cs index c107ab8..cff2d2c 100644 --- a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessor.cs @@ -6,12 +6,40 @@ /// /// Initializes a new instance of the class. /// -/// Service dependencies. -/// A bool value indicating if relational nulls should be used. -public class WindowFunctionsSqliteParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) - : SqliteParameterBasedSqlProcessor(dependencies, useRelationalNulls) +public class WindowFunctionsSqliteParameterBasedSqlProcessor : SqliteParameterBasedSqlProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Service dependencies. + /// Processor parameters. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqliteParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Service dependencies. + /// A bool value indicating if relational nulls should be used. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqliteParameterBasedSqlProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + { + } +#endif + +#if !EF_CORE_8 + /// + protected override Expression ProcessSqlNullability(Expression queryExpression, IReadOnlyDictionary parametersValues, out bool canCache) + => new WindowFunctionsSqliteSqlNullabilityProcessor(Dependencies, Parameters) + .Process(queryExpression, parametersValues, out canCache); +#else /// protected override Expression ProcessSqlNullability(Expression queryExpression, IReadOnlyDictionary parametersValues, out bool canCache) => new WindowFunctionsSqliteSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(queryExpression, parametersValues, out canCache); +#endif } diff --git a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessorFactory.cs b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessorFactory.cs index 61dee40..3c91ad2 100644 --- a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessorFactory.cs +++ b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteParameterBasedSqlProcessorFactory.cs @@ -12,7 +12,13 @@ public class WindowFunctionsSqliteParameterBasedSqlProcessorFactory(RelationalPa { private readonly RelationalParameterBasedSqlProcessorDependencies dependencies = dependencies; +#if !EF_CORE_8 + /// + public override RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters) + => new WindowFunctionsSqliteParameterBasedSqlProcessor(dependencies, parameters); +#else /// public override RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls) => new WindowFunctionsSqliteParameterBasedSqlProcessor(dependencies, useRelationalNulls); +#endif } diff --git a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor.cs b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor.cs index 1346d6c..90ea6d6 100644 --- a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor.cs @@ -6,7 +6,15 @@ /// Type mapping source dependencies. /// Relational type mapping source dependencies. /// The query compilation context object to use. -public class WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor(QueryableMethodTranslatingExpressionVisitorDependencies dependencies, RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, QueryCompilationContext queryCompilationContext) : SqliteQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext) +public class WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor + (QueryableMethodTranslatingExpressionVisitorDependencies dependencies, + RelationalQueryableMethodTranslatingExpressionVisitorDependencies relationalDependencies, +#if !EF_CORE_8 + RelationalQueryCompilationContext queryCompilationContext) +#else + QueryCompilationContext queryCompilationContext) +#endif + : SqliteQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext) { /// protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) => SubQueryProcessor.ProcessSubQuery(this, methodCallExpression) diff --git a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitorFactory.cs b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitorFactory.cs index a4802c8..41fb7bf 100644 --- a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitorFactory.cs +++ b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitorFactory.cs @@ -13,5 +13,10 @@ public class WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitorFac /// public override QueryableMethodTranslatingExpressionVisitor Create(QueryCompilationContext queryCompilationContext) + +#if !EF_CORE_8 + => new WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, (RelationalQueryCompilationContext)queryCompilationContext); +#else => new WindowFunctionsSqliteQueryableMethodTranslatingExpressionVisitor(dependencies, relationalDependencies, queryCompilationContext); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteSqlNullabilityProcessor.cs b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteSqlNullabilityProcessor.cs index dc626ee..9f12f45 100644 --- a/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteSqlNullabilityProcessor.cs +++ b/src/Zomp.EFCore.WindowFunctions.Sqlite/Query/Internal/WindowFunctionsSqliteSqlNullabilityProcessor.cs @@ -6,11 +6,32 @@ /// /// Initializes a new instance of the class. /// -/// Relational Parameter Based Sql Processor Dependencies. -/// A bool value indicating if relational nulls should be used. -public class WindowFunctionsSqliteSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) - : SqliteSqlNullabilityProcessor(dependencies, useRelationalNulls) +public class WindowFunctionsSqliteSqlNullabilityProcessor : SqliteSqlNullabilityProcessor { +#if !EF_CORE_8 + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// Processor Parameters. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqliteSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + { + } +#else + /// + /// Initializes a new instance of the class. + /// + /// Relational Parameter Based Sql Processor Dependencies. + /// A bool value indicating if relational nulls should be used. + [SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "EF Core 8")] + public WindowFunctionsSqliteSqlNullabilityProcessor(RelationalParameterBasedSqlProcessorDependencies dependencies, bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + { + } +#endif + /// protected override SqlExpression VisitCustomSqlExpression(SqlExpression sqlExpression, bool allowOptimizedExpansion, out bool nullable) { diff --git a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OrderingSqlExpression.cs b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OrderingSqlExpression.cs index d625f64..aafda9b 100644 --- a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OrderingSqlExpression.cs +++ b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OrderingSqlExpression.cs @@ -1,6 +1,16 @@ namespace Zomp.EFCore.WindowFunctions.Query.SqlExpressions; -internal sealed class OrderingSqlExpression(OrderingExpression ordering) : ChainedSqlExpression(ordering) +internal sealed class OrderingSqlExpression(OrderingExpression ordering) + : ChainedSqlExpression(ordering) { +#if !EF_CORE_8 + private static ConstructorInfo? quotingConstructor; +#endif + public RowOrRangeExpression? RowOrRangeClause { get; set; } + +#if !EF_CORE_8 + public override Expression Quote() + => New(quotingConstructor ??= typeof(OrderingSqlExpression).GetConstructor([typeof(OrderingExpression)])!, List[0].Quote()); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OverExpression.cs b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OverExpression.cs index be7a050..3268e48 100644 --- a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OverExpression.cs +++ b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/OverExpression.cs @@ -6,6 +6,10 @@ internal sealed class OverExpression(OrderingSqlExpression? orderingExpression, PartitionByExpression? partitionByExpression, bool isLatestPartitionBy) : SqlExpression(typeof(OverExpression), null) { +#if !EF_CORE_8 + private static ConstructorInfo? quotingConstructor; +#endif + /// /// Gets the partition by clause. /// @@ -21,5 +25,10 @@ internal sealed class OverExpression(OrderingSqlExpression? orderingExpression, /// public OrderingSqlExpression? OrderingExpression { get; } = orderingExpression; +#if !EF_CORE_8 + public override Expression Quote() + => New(quotingConstructor ??= typeof(OverExpression).GetConstructor([typeof(OrderingExpression), typeof(PartitionByExpression), typeof(bool)])!, OrderingExpression?.Quote() ?? Constant(null, typeof(OrderingSqlExpression)), PartitionByExpression?.Quote() ?? Constant(null, typeof(PartitionByExpression)), Constant(IsLatestPartitionBy, typeof(bool))); +#endif + protected override void Print(ExpressionPrinter expressionPrinter) => throw new NotImplementedException(); } diff --git a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/PartitionByExpression.cs b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/PartitionByExpression.cs index 4248c2b..45fec74 100644 --- a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/PartitionByExpression.cs +++ b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/PartitionByExpression.cs @@ -2,4 +2,7 @@ internal sealed class PartitionByExpression(SqlExpression partition) : ChainedSqlExpression(partition) { +#if !EF_CORE_8 + public override Expression Quote() => throw new NotImplementedException(); +#endif } \ No newline at end of file diff --git a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/RowOrRangeExpression.cs b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/RowOrRangeExpression.cs index 09f10d4..371fcfd 100644 --- a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/RowOrRangeExpression.cs +++ b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/RowOrRangeExpression.cs @@ -45,6 +45,11 @@ public override int GetHashCode() return hash.ToHashCode(); } +#if !EF_CORE_8 + /// + public override Expression Quote() => throw new NotImplementedException(); +#endif + /// protected override void Print(ExpressionPrinter expressionPrinter) { diff --git a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/WindowFunctionExpression.cs b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/WindowFunctionExpression.cs index 0dfa3a2..3e087c5 100644 --- a/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/WindowFunctionExpression.cs +++ b/src/Zomp.EFCore.WindowFunctions/Query/SqlExpressions/WindowFunctionExpression.cs @@ -105,6 +105,11 @@ public override int GetHashCode() return hash.ToHashCode(); } +#if !EF_CORE_8 + /// + public override Expression Quote() => throw new NotImplementedException(); +#endif + /// protected override Expression VisitChildren(ExpressionVisitor visitor) {