【发布时间】:2023-03-16 15:46:09
【问题描述】:
我已经在数据库中存储了时间字符串"12:20 PM",我想将它与 linq 查询 (EF) 中的当前时间进行比较。因为我不能使用 Convert.ToDateTime 等转换它,因为它不能转换成任何 sql 表达式。
我正在考虑编写如下查询,但我知道这无济于事。请指教。
List<CompanyScheduler> companySchedulers =
context.CompanySchedulers
.Where(m => m.IsActive && m.Start <= EntityFunctions.AddMinutes(td, m.TimeZoneOffset))
.Where(m => (m.LastRun.HasValue && EntityFunctions.TruncateTime(m.LastRun) < tdExcludeTime) || (!m.LastRun.HasValue))
.Where(m => (m.When == (int)When.Daily && (Convert.ToDateTime("01-01-1990 " + m.RecurAt).TimeOfDay < EntityFunctions.AddMinutes(td, m.TimeZoneOffset).Value.TimeOfDay)) ||
(m.When == (int)When.Once && !m.LastRun.HasValue) ||
(m.When == (int)When.Weekly && m.RecurrEvery.Contains(today)))
.ToList();
【问题讨论】:
-
您最好添加一列,然后使用 SQL 以合理且类型安全的方式更新该列。
-
@Aron:我没明白。请多解释一下。
-
您的主要问题是您在数据库中将时间存储为
varchar。这与您存储的信息不匹配。因此,您想使用Convert.ToDateTime来解决此问题。正确的方法是首先将其存储为日期时间。这就是数据库模式的全部意义所在。修复您的架构,使其保持理智,然后您的查询将很容易。 -
@Aron 好的,如果我更改数据库架构,那么在 EF 查询中比较时间部分的查询应该是什么? (我们不能在 EF 查询中使用 Convert.ToDateTime。)
-
从 EF 5 开始,支持
Time的数据类型,映射到System.TimeSpan。鉴于TimeSpan startTime;,所以很简单.Where(m => m.Start < startTime)。
标签: c# sql linq sql-server-2008 entity-framework