[英]Convert string time to datetime or timespan in entity framework query
我已經在數據庫中存儲了時間字符串,例如"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();
在EF 6.x以下是不可能的。 可以使用存儲過程或進行所有轉換,然后再鏈接查詢。
沒有直接的方法可以將字符串“解析”為Linq到Entities中的 DateTime
或TimeSpan
,但是可以使用SqlFunctions
和DbFunctions
類來實現:
對於TimeSpan :
DbFunctions.CreateTime(SqlFunctions.DatePart("hh", timeString),
SqlFunctions.DatePart("mi", timeString),
SqlFunctions.DatePart("ss", timeString));
對於DateTime :
DbFunctions.CreateDateTime(SqlFunctions.DatePart("yy", dateString),
SqlFunctions.DatePart("mm", dateString),
SqlFunctions.DatePart("dd", dateString),
SqlFunctions.DatePart("hh", dateString),
SqlFunctions.DatePart("mi", dateString),
SqlFunctions.DatePart("ss", dateString));
您可以在集合上通過調用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()
方法僅加載所需的記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.