diff --git a/Version.props b/Version.props index c3e2b66..7436e09 100644 --- a/Version.props +++ b/Version.props @@ -1,6 +1,6 @@ - - - 8.0.0 - alpha - 2 + 8.0.0 + alpha + 2 - - + - - - true - true - + + true + true + - - $(PreReleaseVersionLabel).$(PreReleaseVersionIteration) - $(VersionSuffix).ci.$(ContinuousIntegrationTimestamp) - $(VersionSuffix).debug - $(VersionSuffix)+sha.$(BuildSha) - + + $(PreReleaseVersionLabel).$(PreReleaseVersionIteration) + $(VersionSuffix).ci.$(ContinuousIntegrationTimestamp) + $(VersionSuffix).debug + $(VersionSuffix)+sha.$(BuildSha) + - - debug - + + debug + - - - - - - - + diff --git a/src/EFCore.Jet.Data/JetDataReader.cs b/src/EFCore.Jet.Data/JetDataReader.cs index b92a028..8e6f429 100644 --- a/src/EFCore.Jet.Data/JetDataReader.cs +++ b/src/EFCore.Jet.Data/JetDataReader.cs @@ -210,7 +210,7 @@ namespace EntityFrameworkCore.Jet.Data } else if (value is DateTime dateTime) { - return new DateTimeOffset(dateTime); + return new DateTimeOffset(dateTime, TimeSpan.Zero); } return (DateTimeOffset)value; diff --git a/src/EFCore.Jet/Storage/Internal/JetDateTimeOffsetTypeMapping.cs b/src/EFCore.Jet/Storage/Internal/JetDateTimeOffsetTypeMapping.cs index 901b998..09ed439 100644 --- a/src/EFCore.Jet/Storage/Internal/JetDateTimeOffsetTypeMapping.cs +++ b/src/EFCore.Jet/Storage/Internal/JetDateTimeOffsetTypeMapping.cs @@ -37,7 +37,7 @@ namespace EntityFrameworkCore.Jet.Storage.Internal // OLE DB can't handle the DateTimeOffset type. if (parameter.Value is DateTimeOffset dateTimeOffset) { - parameter.Value = dateTimeOffset.DateTime; + parameter.Value = dateTimeOffset.UtcDateTime; parameter.DbType = System.Data.DbType.DateTime; } @@ -50,7 +50,7 @@ namespace EntityFrameworkCore.Jet.Storage.Internal protected override string GenerateNonNullSqlLiteral(object value) { if (value is not DateTimeOffset offset) return base.GenerateNonNullSqlLiteral(value); - var dateTime = offset.DateTime; + var dateTime = offset.UtcDateTime; return string.Format(CultureInfo.InvariantCulture, DateTimeFormatConst, dateTime); } } diff --git a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt index 82ddd61..70ce8f1 100644 --- a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt +++ b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt @@ -10462,6 +10462,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_count EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_count_subquery_without_collision(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_month_component(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_datetimeoffset_month_component(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.GearsOfWarQueryJetTest.Where_enum_has_flag_subquery_with_pushdown(isAsync: False) @@ -17040,6 +17044,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_co EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_count_subquery_without_collision(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPCGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_with_pushdown(async: False) @@ -18634,6 +18642,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_co EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_count_subquery_without_collision(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_DateOnly_DayOfWeek(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_dayofyear_component(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_datetimeoffset_month_component(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_client_eval(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.TPTGearsOfWarQueryJetTest.Where_enum_has_flag_subquery_with_pushdown(async: False) diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs index 25b700d..69b7da9 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetFixture.cs @@ -26,5 +26,17 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query base.Seed(context); } + + public override ISetSource GetExpectedData() + { + var data = (GearsOfWarData)base.GetExpectedData(); + + foreach (var mission in data.Missions) + { + mission.Timeline = JetTestHelpers.GetExpectedValue(mission.Timeline); + } + + return data; + } } } diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs index b7b938c..d182f58 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs @@ -2563,9 +2563,11 @@ WHERE DATEPART('yyyy', `m`.`Timeline`) = 2"); await base.Where_datetimeoffset_month_component(isAsync); AssertSql( - $@"SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Rating`, `m`.`Timeline` + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` FROM `Missions` AS `m` -WHERE DATEPART('m', `m`.`Timeline`) = 1"); +WHERE DATEPART('m', `m`.`Timeline`) = 1 +"""); } public override async Task Where_datetimeoffset_dayofyear_component(bool isAsync) @@ -2573,9 +2575,11 @@ WHERE DATEPART('m', `m`.`Timeline`) = 1"); await base.Where_datetimeoffset_dayofyear_component(isAsync); AssertSql( - $@"SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Rating`, `m`.`Timeline` + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` FROM `Missions` AS `m` -WHERE DATEPART(dayofyear, `m`.`Timeline`) = 2"); +WHERE DATEPART('y', `m`.`Timeline`) = 2 +"""); } public override async Task Where_datetimeoffset_day_component(bool isAsync) diff --git a/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs b/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs index 5593d55..6a41c3e 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/QueryBugsTest.cs @@ -10321,7 +10321,7 @@ WHERE `e`.`DateTime` = CDATE(@__parameter_0) AssertSql( """ -@__parameter_0='2021-11-12T13:14:15.0000000' (DbType = DateTime) +@__parameter_0='2021-11-12T03:14:15.0000000Z' (DbType = DateTime) SELECT TOP 1 `e`.`DateTimeOffset` FROM `Entities` AS `e` diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetFixture.cs b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetFixture.cs index 8c61612..97d4393 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetFixture.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetFixture.cs @@ -28,4 +28,16 @@ public class TPCGearsOfWarQueryJetFixture : TPCGearsOfWarQueryRelationalFixture base.Seed(context); } + + public override ISetSource GetExpectedData() + { + var data = (GearsOfWarData)base.GetExpectedData(); + + foreach (var mission in data.Missions) + { + mission.Timeline = JetTestHelpers.GetExpectedValue(mission.Timeline); + } + + return data; + } } diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs index 93fb93b..842c6f0 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs @@ -3738,10 +3738,10 @@ WHERE DATEPART(year, [m].[Timeline]) = 2 await base.Where_datetimeoffset_month_component(async); AssertSql( -""" -SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline] -FROM [Missions] AS [m] -WHERE DATEPART(month, [m].[Timeline]) = 1 + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` +FROM `Missions` AS `m` +WHERE DATEPART('m', `m`.`Timeline`) = 1 """); } @@ -3750,10 +3750,10 @@ WHERE DATEPART(month, [m].[Timeline]) = 1 await base.Where_datetimeoffset_dayofyear_component(async); AssertSql( -""" -SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline] -FROM [Missions] AS [m] -WHERE DATEPART(dayofyear, [m].[Timeline]) = 2 + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` +FROM `Missions` AS `m` +WHERE DATEPART('y', `m`.`Timeline`) = 2 """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetFixture.cs b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetFixture.cs index 8af7bb9..673cb4c 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetFixture.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetFixture.cs @@ -28,4 +28,16 @@ public class TPTGearsOfWarQueryJetFixture : TPTGearsOfWarQueryRelationalFixture base.Seed(context); } + + public override ISetSource GetExpectedData() + { + var data = (GearsOfWarData)base.GetExpectedData(); + + foreach (var mission in data.Missions) + { + mission.Timeline = JetTestHelpers.GetExpectedValue(mission.Timeline); + } + + return data; + } } diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs index a95c4da..66a2ebf 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs @@ -2989,10 +2989,10 @@ WHERE DATEPART(year, [m].[Timeline]) = 2 await base.Where_datetimeoffset_month_component(async); AssertSql( -""" -SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline] -FROM [Missions] AS [m] -WHERE DATEPART(month, [m].[Timeline]) = 1 + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` +FROM `Missions` AS `m` +WHERE DATEPART('m', `m`.`Timeline`) = 1 """); } @@ -3001,10 +3001,10 @@ WHERE DATEPART(month, [m].[Timeline]) = 1 await base.Where_datetimeoffset_dayofyear_component(async); AssertSql( -""" -SELECT [m].[Id], [m].[CodeName], [m].[Duration], [m].[Rating], [m].[Timeline] -FROM [Missions] AS [m] -WHERE DATEPART(dayofyear, [m].[Timeline]) = 2 + """ +SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline` +FROM `Missions` AS `m` +WHERE DATEPART('y', `m`.`Timeline`) = 2 """); } diff --git a/test/EFCore.Jet.FunctionalTests/TestUtilities/JetTestHelpers.cs b/test/EFCore.Jet.FunctionalTests/TestUtilities/JetTestHelpers.cs index db0b517..1dc1f94 100644 --- a/test/EFCore.Jet.FunctionalTests/TestUtilities/JetTestHelpers.cs +++ b/test/EFCore.Jet.FunctionalTests/TestUtilities/JetTestHelpers.cs @@ -6,6 +6,7 @@ using EntityFrameworkCore.Jet.Diagnostics.Internal; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.TestUtilities; using Microsoft.Extensions.DependencyInjection; +using System; namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities { @@ -26,5 +27,11 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.TestUtilities public override LoggingDefinitions LoggingDefinitions { get; } = new JetLoggingDefinitions(); public string GetStoreName(string storeNameWithoutSuffix) => $"{storeNameWithoutSuffix}.accdb"; + + public static DateTimeOffset GetExpectedValue(DateTimeOffset value) + { + var val = value.UtcDateTime; + return new DateTimeOffset(new DateTime(val.Year, val.Month, val.Day, val.Hour, val.Minute, val.Second), TimeSpan.Zero); + } } }