我在数据库中存储了时间字符串"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();
答案 0 :(得分:1)
在EF 6.x下面不可能。使用存储过程或在链接查询之前进行所有转换。
答案 1 :(得分:1)
没有直接的方法可以将 Linq to Entities 中的字符串“解析”到DateTime
或TimeSpan
,但您可以使用SqlFunctions
和{ {1}}类:
对于TimeSpan :
DbFunctions
对于DateTime :
DbFunctions.CreateTime(SqlFunctions.DatePart("hh", timeString),
SqlFunctions.DatePart("mi", timeString),
SqlFunctions.DatePart("ss", timeString));
答案 2 :(得分:0)
您可以在收藏中将数据加载到内存中(通过调用ToArray()
或ToList()
)并使用Convert.ToDateTime
:
var date = DateTime.Today;
var areEqual = dataContext.YourTable.ToList()
//now the data is in memory and you can apply whatever projection you want
.Select(x => new{Date = Convert.ToDateTime(x.DateStringColumn)})
.All(x => x.Date == date);
但是,如果数据集非常大,这会增加内存使用量。为避免这种情况,请使用Where()
方法仅加载所需的记录。