LINQ 查询不满足日期时间验证
LINQ query not statisfying the datetime validation
这是我用于返回匹配记录的 LINQ
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate == StaffAwards.AwardDate);
StaffAwards.AwardDate 将采用这种格式“09/12/2020 12:00:00 AM”
而我的 table 中的 AwardDate 将像这样“2020-12-09 17:16:00.000”
如何将 StaffAwards.AwardDate 转换为 Sql 服务器日期时间?
任何帮助将不胜感激。
要使用数据库格式的日期,您可以使用 DbFunctions。
像这样:
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && DbFunctions.TruncateTime(DateTime.Parse(c.AwardDate)) == StaffAwards.AwardDate);
重要提示:对于 TruncateTime,您必须使用 DateTime。您必须将 c.AwardDate 转换为 DateTime。 DateTime.Parse(c.AwardDate)
很可能,您将 SQL 服务器安装在另一台机器上,这可能是由于日期格式不同所致。
但是不需要这种转换,entity framework 会自动为您完成。
如果你只是比较日期,你可以使用这个代码:
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate.Date == StaffAwards.AwardDate.Date);
如果您的代码和数据库按应有的方式使用 Date/DateTime 类型,而不是字符串,那么您需要了解以下几点:
- 日期数据类型没有格式,只有从日期创建的字符串才有格式。您在 code/sql 查询工具中看到的任何格式都是它在向您显示日期时应用的格式(它必须将其转换为字符串才能显示)
- 时间为午夜的日期时间与时间为 17:16 的日期时间完全不同,就像数字 1.0 与 1.75352 是完全不同的数字一样;如果您使用 equals 并传递午夜以外的任何时间,您将永远不会获得 return 您的午夜时间记录,就像您永远不会成功获得该人的年龄的记录一样通过询问“where age = 1.75352”
是 1.0
要么修正你的参数,使其成为午夜,就像数据库一样,要么使用参数范围(如果数据库中的日期也有其他时间)
//if the db date is always midnight
.Where(x => x.DateColumnInDb == datetimeParameter.Date);
//if the db might have times too
.Where(x => x.DateColumnInDb >= datetimeParameter.Date && x.DateColumnInDb < datetimeParameter.Date.AddDays(1));
通过使用范围,我们不会在每次要查询时冒险要求数据库转换 table 中的每个日期时间。在 where 子句中转换数据通常不是一个好主意,因为它通常会导致显着的性能损失,因为无法使用索引
此外,请确保您的 .net 端日期时间和数据库时间使用相同的时区,否则它们实际上指的是不同的时间
这是我用于返回匹配记录的 LINQ
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate == StaffAwards.AwardDate);
StaffAwards.AwardDate 将采用这种格式“09/12/2020 12:00:00 AM” 而我的 table 中的 AwardDate 将像这样“2020-12-09 17:16:00.000”
如何将 StaffAwards.AwardDate 转换为 Sql 服务器日期时间? 任何帮助将不胜感激。
要使用数据库格式的日期,您可以使用 DbFunctions。
像这样:
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && DbFunctions.TruncateTime(DateTime.Parse(c.AwardDate)) == StaffAwards.AwardDate);
重要提示:对于 TruncateTime,您必须使用 DateTime。您必须将 c.AwardDate 转换为 DateTime。 DateTime.Parse(c.AwardDate)
很可能,您将 SQL 服务器安装在另一台机器上,这可能是由于日期格式不同所致。
但是不需要这种转换,entity framework 会自动为您完成。 如果你只是比较日期,你可以使用这个代码:
var staffawards = await _context.StaffAwards.FirstOrDefaultAsync(c => c.StaffID == StaffAwards.StaffID && c.EmpID == StaffAwards.EmpID && c.AwardDate.Date == StaffAwards.AwardDate.Date);
如果您的代码和数据库按应有的方式使用 Date/DateTime 类型,而不是字符串,那么您需要了解以下几点:
- 日期数据类型没有格式,只有从日期创建的字符串才有格式。您在 code/sql 查询工具中看到的任何格式都是它在向您显示日期时应用的格式(它必须将其转换为字符串才能显示)
- 时间为午夜的日期时间与时间为 17:16 的日期时间完全不同,就像数字 1.0 与 1.75352 是完全不同的数字一样;如果您使用 equals 并传递午夜以外的任何时间,您将永远不会获得 return 您的午夜时间记录,就像您永远不会成功获得该人的年龄的记录一样通过询问“where age = 1.75352” 是 1.0
要么修正你的参数,使其成为午夜,就像数据库一样,要么使用参数范围(如果数据库中的日期也有其他时间)
//if the db date is always midnight
.Where(x => x.DateColumnInDb == datetimeParameter.Date);
//if the db might have times too
.Where(x => x.DateColumnInDb >= datetimeParameter.Date && x.DateColumnInDb < datetimeParameter.Date.AddDays(1));
通过使用范围,我们不会在每次要查询时冒险要求数据库转换 table 中的每个日期时间。在 where 子句中转换数据通常不是一个好主意,因为它通常会导致显着的性能损失,因为无法使用索引
此外,请确保您的 .net 端日期时间和数据库时间使用相同的时区,否则它们实际上指的是不同的时间