【问题标题】:How to convert a String to TimeSpan inside a Linq Expression?如何在 Linq 表达式中将字符串转换为 TimeSpan?
【发布时间】:2016-04-12 14:30:13
【问题描述】:

我正在使用 C# MVC EF Code First,其中有一个 Linq 表达式,如下所示:

var data = new SchedulerAjaxData(new GTOpel().mxes.Select(e => new 
    { 
        id = e.nkeyid, 
        text = e.texto, 
        start_date = e.data, 
        end_date = e.data 
    })
);

我现在的问题是:我有一个 DateTime 字段(数据),其中包含我想要的日期,但它使用默认时间 (00:00:00.000)。
我在这个字段上得到的格式类似于“YYYY-MM-dd HH:mm:ss.fff”
我有一个时间字段 (hinicio),它是一个字符串而不是 DateTime/TimeSpan 类型 - 我想将 hinicio 添加到数据中 - 让我们为 hinicio 提供一个示例值,例如“13:00”,因为这是格式(“ HH:mm") 数据库用于字符串。

最后,这就是我想要得到的:“2016-01-01 13:00:00.000”

既然我们讨论的是 DateTime 和 String,有没有一种合理的方法可以在我上面提到的 IQueryable 表达式中格式化这两个值?
如果不是,我应该如何在 Select 方法中使用我的值之前对其进行格式化?

更新/更多详细信息:

对于那些可能对此感到疑惑的人,变量 id、text、start_date 和 end_date 对于调度程序库是必需的,所以我可以看到我已经得到的事件。
此调度程序是我正在使用的模板,现在我正在尝试使用我的数据库来实现它。
更多信息:http://docs.dhtmlx.com/scheduler/

在此先感谢并致以最诚挚的问候,
格兰维克

【问题讨论】:

  • 我的建议是,不要将时间作为字符串存储在数据库中。这就是 DateTime/DateTimeoffset 类型的用途。
  • 您希望添加由 SQL Server 完成,还是可以在客户端完成?还有很多问题已经在讨论这个主题了,你试过搜索吗?
  • hinicio的格式是什么?
  • 是的,但我的意思是hinicio 值,这些字符串就像“12:15”或“12m”,还是只是一个数字?
  • 格式表示这些字符串中的值是什么样的? 'yyyy-MM-dd' ? 'MM/dd/YYYY'? DateTime 不是一种格式,它是一种类型。 DateTime 具有 no 格式,它是一个二进制值,可根据多种格式将 formatted 转换为字符串。 default 格式是系统语言环境定义的任何格式。如果你尝试解析29/3/2015' on a US computer you'd get an error because it would expect 3/29/2015`

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

您必须将hinicio 值转换为TimeSpan,然后将其添加到data

要在 Linq to Entities 中执行此操作,您必须使用 DbFunctionsSqlFunctions 类。

如果hinicio 看起来像hh:mm,您的查询应该是这样的:

var data = new SchedulerAjaxData(new GTOpel().mxes.Select(e => new 
{
    ...
    start_date = DbFunctions.AddMinutes(e.data, 
                     DbFunctions.DiffMinutes(TimeSpan.Zero, 
                                             DbFunctions.CreateTime(SqlFunctions.DatePart("hh", e.hinicio),
                                                                    SqlFunctions.DatePart("mi", e.hinicio), 
                                                                    0.0))) 
}));

【讨论】:

  • 假设 new GTOpel().mxes 返回一个 IQueryable<T>,这将引发 Entity Framework 无法将 TimeSpan.Parse() 转换为存储表达式的异常。
  • 这正是我想要的!这很顺利,现在我可以正确设置我的事件了!非常感谢@arturo-menchaca,你无法想象这对我有多大帮助!!!
【解决方案2】:

如果hinicio中时间的格式是标准格式(例如14:23或2:23 PM),那么转换很容易:

start_date = e.data + DateTime.Parse(hinicio).TimeOfDay, 

【讨论】:

  • 这不能在 LINQ to EF 中工作,因为它不能被转换为 SQL。结果必须首先实现(例如使用 ToLinq()),并且可以将 Select 应用于它们
  • PM 不是标准格式,它是一种 本地化 格式,不适用于非英语语言环境。 可以使用所有 .NET 解析技巧,例如将特定文化传递给 Parse 或使用 ParseExact 匹配任何格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多