@@ -3956,6 +3956,24 @@ WHERE EXTRACT(day FROM `m`.`Timeline`) = 2
39563956""");
39573957 }
39583958
3959+ [ConditionalTheory]
3960+ [MemberData(nameof(IsAsyncData))]
3961+ public virtual async Task Where_datetimeoffset_hour_component(bool async)
3962+ {
3963+ await AssertQuery(
3964+ async,
3965+ ss => from m in ss.Set<Mission>()
3966+ where m.Timeline.Hour == /* 10 */ 8
3967+ select m);
3968+
3969+ AssertSql(
3970+ """
3971+ SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Difficulty`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
3972+ FROM `Missions` AS `m`
3973+ WHERE EXTRACT(hour FROM `m`.`Timeline`) = 8
3974+ """);
3975+ }
3976+
39593977 public override async Task Where_datetimeoffset_minute_component(bool async)
39603978 {
39613979 await base.Where_datetimeoffset_minute_component(async);
@@ -4058,6 +4076,33 @@ SELECT DATE_ADD(`m`.`Timeline`, INTERVAL 1000 * CAST(300.0 AS signed) microsecon
40584076""");
40594077 }
40604078
4079+ [ConditionalTheory]
4080+ [MemberData(nameof(IsAsyncData))]
4081+ public virtual async Task Where_datetimeoffset_milliseconds_parameter_and_constant(bool async)
4082+ {
4083+ var dateTimeOffset = MySqlTestHelpers.GetExpectedValue(new DateTimeOffset(599898024001234567, new TimeSpan(1, 30, 0)));
4084+
4085+ // Literal where clause
4086+ var p = Expression.Parameter(typeof(Mission), "i");
4087+ var dynamicWhere = Expression.Lambda<Func<Mission, bool>>(
4088+ Expression.Equal(
4089+ Expression.Property(p, "Timeline"),
4090+ Expression.Constant(dateTimeOffset)
4091+ ), p);
4092+
4093+ await AssertCount(
4094+ async,
4095+ ss => ss.Set<Mission>().Where(dynamicWhere),
4096+ ss => ss.Set<Mission>().Where(m => m.Timeline == dateTimeOffset));
4097+
4098+ AssertSql(
4099+ """
4100+ SELECT COUNT(*)
4101+ FROM `Missions` AS `m`
4102+ WHERE `m`.`Timeline` = TIMESTAMP '1902-01-02 08:30:00.123456'
4103+ """);
4104+ }
4105+
40614106 public override async Task Orderby_added_for_client_side_GroupJoin_composite_dependent_to_principal_LOJ_when_incomplete_key_is_used(
40624107 bool async)
40634108 {
@@ -11433,6 +11478,22 @@ WHERE ASCII(`s`.`Banner`) = 2
1143311478""");
1143411479 }
1143511480
11481+ [ConditionalTheory]
11482+ [MemberData(nameof(IsAsyncData))]
11483+ public virtual async Task Array_access_on_byte_array(bool async)
11484+ {
11485+ await AssertQuery(
11486+ async,
11487+ ss => ss.Set<Squad>().Where(s => s.Banner5[2] == 6));
11488+
11489+ AssertSql(
11490+ """
11491+ SELECT `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`
11492+ FROM `Squads` AS `s`
11493+ WHERE ASCII(SUBSTRING(`s`.`Banner5`, 2 + 1, 1)) = 6
11494+ """);
11495+ }
11496+
1143611497 public override async Task Project_shadow_properties(bool async)
1143711498 {
1143811499 await base.Project_shadow_properties(async);
@@ -13363,6 +13424,102 @@ public override async Task Using_indexer_on_byte_array_and_string_in_projection(
1336313424""");
1336413425 }
1336513426
13427+ [ConditionalTheory]
13428+ [MemberData(nameof(IsAsyncData))]
13429+ public virtual async Task DateTimeOffset_to_unix_time_milliseconds(bool async)
13430+ {
13431+ var unixEpochMilliseconds = 0L;
13432+
13433+ await AssertQuery(
13434+ async,
13435+ ss => from g in ss.Set<Gear>()
13436+ join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13437+ where !ss.Set<SquadMission>()
13438+ .Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13439+ .Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
13440+ .Any()
13441+ select g,
13442+ ss => from g in ss.Set<Gear>()
13443+ join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13444+ where !ss.Set<SquadMission>()
13445+ .Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13446+ .Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeMilliseconds() == unixEpochMilliseconds)
13447+ .Any()
13448+ select g,
13449+ elementSorter: e => (e.Nickname, e.SquadId),
13450+ elementAsserter: (e, a) => AssertEqual(e, a));
13451+
13452+ AssertSql(
13453+ """
13454+ @__unixEpochMilliseconds_0='0'
13455+
13456+ SELECT `u`.`Nickname`, `u`.`SquadId`, `u`.`AssignedCityName`, `u`.`CityOfBirthName`, `u`.`FullName`, `u`.`HasSoulPatch`, `u`.`LeaderNickname`, `u`.`LeaderSquadId`, `u`.`Rank`, `u`.`Discriminator`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
13457+ FROM (
13458+ SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, 'Gear' AS `Discriminator`
13459+ FROM `Gears` AS `g`
13460+ UNION ALL
13461+ SELECT `o`.`Nickname`, `o`.`SquadId`, `o`.`AssignedCityName`, `o`.`CityOfBirthName`, `o`.`FullName`, `o`.`HasSoulPatch`, `o`.`LeaderNickname`, `o`.`LeaderSquadId`, `o`.`Rank`, 'Officer' AS `Discriminator`
13462+ FROM `Officers` AS `o`
13463+ ) AS `u`
13464+ INNER JOIN `Squads` AS `s` ON `u`.`SquadId` = `s`.`Id`
13465+ LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
13466+ WHERE NOT EXISTS (
13467+ SELECT 1
13468+ FROM `SquadMissions` AS `s0`
13469+ INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
13470+ WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochMilliseconds_0 = (TIMESTAMPDIFF(microsecond, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)) DIV (1000)))
13471+ ORDER BY `u`.`Nickname`, `u`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
13472+ """);
13473+ }
13474+
13475+ [ConditionalTheory]
13476+ [MemberData(nameof(IsAsyncData))]
13477+ public virtual async Task DateTimeOffset_to_unix_time_seconds(bool async)
13478+ {
13479+ var unixEpochSeconds = 0L;
13480+
13481+ await AssertQuery(
13482+ async,
13483+ ss => from g in ss.Set<Gear>()
13484+ join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13485+ where !ss.Set<SquadMission>()
13486+ .Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13487+ .Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
13488+ .Any()
13489+ select g,
13490+ ss => from g in ss.Set<Gear>()
13491+ join squad in ss.Set<Squad>() on g.SquadId equals squad.Id
13492+ where !ss.Set<SquadMission>()
13493+ .Join(ss.Set<Mission>(), sm => sm.MissionId, m => m.Id, (sm, m) => new { sm, m })
13494+ .Where(x => x.sm.SquadId == squad.Id && x.m.Timeline.ToUnixTimeSeconds() == unixEpochSeconds)
13495+ .Any()
13496+ select g,
13497+ elementSorter: e => (e.Nickname, e.SquadId),
13498+ elementAsserter: (e, a) => AssertEqual(e, a));
13499+
13500+ AssertSql(
13501+ """
13502+ @__unixEpochSeconds_0='0'
13503+
13504+ SELECT `u`.`Nickname`, `u`.`SquadId`, `u`.`AssignedCityName`, `u`.`CityOfBirthName`, `u`.`FullName`, `u`.`HasSoulPatch`, `u`.`LeaderNickname`, `u`.`LeaderSquadId`, `u`.`Rank`, `u`.`Discriminator`, `s`.`Id`, `s`.`Banner`, `s`.`Banner5`, `s`.`InternalNumber`, `s`.`Name`, `s1`.`SquadId`, `s1`.`MissionId`
13505+ FROM (
13506+ SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, 'Gear' AS `Discriminator`
13507+ FROM `Gears` AS `g`
13508+ UNION ALL
13509+ SELECT `o`.`Nickname`, `o`.`SquadId`, `o`.`AssignedCityName`, `o`.`CityOfBirthName`, `o`.`FullName`, `o`.`HasSoulPatch`, `o`.`LeaderNickname`, `o`.`LeaderSquadId`, `o`.`Rank`, 'Officer' AS `Discriminator`
13510+ FROM `Officers` AS `o`
13511+ ) AS `u`
13512+ INNER JOIN `Squads` AS `s` ON `u`.`SquadId` = `s`.`Id`
13513+ LEFT JOIN `SquadMissions` AS `s1` ON `s`.`Id` = `s1`.`SquadId`
13514+ WHERE NOT EXISTS (
13515+ SELECT 1
13516+ FROM `SquadMissions` AS `s0`
13517+ INNER JOIN `Missions` AS `m` ON `s0`.`MissionId` = `m`.`Id`
13518+ WHERE (`s`.`Id` = `s0`.`SquadId`) AND (@__unixEpochSeconds_0 = TIMESTAMPDIFF(second, TIMESTAMP '1970-01-01 00:00:00', `m`.`Timeline`)))
13519+ ORDER BY `u`.`Nickname`, `u`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
13520+ """);
13521+ }
13522+
1336613523 public override async Task Set_operator_with_navigation_in_projection_groupby_aggregate(bool async)
1336713524 {
1336813525 await base.Set_operator_with_navigation_in_projection_groupby_aggregate(async);
0 commit comments