在实体框架查询中将字符串时间转换为日期时间或时间跨度

时间:2014-01-30 07:24:16

标签: c# sql linq sql-server-2008 entity-framework

我在数据库中存储了时间字符串"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();

3 个答案:

答案 0 :(得分:1)

在EF 6.x下面不可能。使用存储过程或在链接查询之前进行所有转换。

答案 1 :(得分:1)

没有直接的方法可以将 Linq to Entities 中的字符串“解析”到DateTimeTimeSpan,但您可以使用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()方法仅加载所需的记录。