LINQ使用DTO将SQL Server Datetime转换为字符串

时间:2017-04-21 13:24:09

标签: c# entity-framework linq datetime

我的任务是将一个页面添加到我们尚未构建但负责处理的API中。 API使用的是C#MVC5。我不太了解MVC5,但我试图保持与API其余部分使用的设计模式相同的设计模式。我必须添加一些功能,允许前端用户将文件上传到服务器,该服务器将被处理以插入SQL Server数据库。此功能还将从DB中的表返回所有文件名称和导入文件状态的列表。

我遇到的问题是将日期时间转换为拉动文件列表的LINQ查询中的字符串。

我试图尝试使用这个答案LINQ convert DateTime to string,但没有运气。

这就是我到目前为止,我已经标明导致问题的那条线:

[Route("ImportLogs", Name ="GetImportLogs")]
[HttpGet]
[ResponseType(typeof(List<IHttpActionResult>))]
public IHttpActionResult GetImportLogs()
{
    var query =
        from dbitem in db.ImportLogs
        orderby dbitem.import_log_id
        select new ImportLogDto()
        {
            Id = dbitem.import_log_id,
            FileName = dbitem.import_file_name,
            ImportTimeStamp = dbitem.import_timeStamp,
            ImportStatus = dbitem.import_status,
            ImportMessage = dbitem.import_message
         };

         query.ToList()
             .Select(o => new ImportLogDto
             {
                 Id = o.Id,
                 FileName = o.FileName,
                 ImportMessage = o.ImportMessage,
                 ImportStatus = o.ImportStatus,
                 ImportTimeStamp = o.ImportTimeStamp.ToString() //PROBLEM LINE
              });

         return Ok(query);
}

我得到的错误是

  

无法隐式转换类型&#39;字符串&#39;到&#39; System.DateTime&#39;

出错了什么?任何帮助,将不胜感激。 TIA。

编辑:

这是DTO:

public class ImportLogDto
{
    public int Id { get; set; }
    public string FileName { get; set; }
    public DateTime ImportTimeStamp { get; set; }
    public string ImportStatus { get; set; }
    public string ImportMessage { get; set; }

}

2 个答案:

答案 0 :(得分:2)

您正尝试将string分配到DateTime,以便获得该异常。如果要将其强制转换为字符串,请按以下方式更改模型:

public class ImportLogDto
{
    public int Id { get; set; }
    public string FileName { get; set; }
    public string ImportTimeStamp { get; set; } // Changed type
    public string ImportStatus { get; set; }
    public string ImportMessage { get; set; }    
}

然后你的查询:

var query = (from dbitem in db.ImportLogs
             orderby dbitem.import_log_id
             select new {
                 Idbitem.import_log_id,
                 dbitem.import_file_name,
                 dbitem.import_timeStamp, // Still DateTime
                 dbitem.import_status,
                 dbitem.import_message
             }).AsEnumerable(); // Retrieved from Database
            .Select(o => new ImportLogDto
            {
                Id = o.import_log_id,
                FileName = o.import_file_name,
                ImportMessage = o.import_message,
                ImportStatus = o.import_status,
                ImportTimeStamp = o.import_timeStamp.ToString() // Changes to string
            });

如果您希望更改API的DateTime 格式,请使用ToString的重载并指定格式:

ImportTimeStamp = o.ImportTimeStamp.ToString("dd/MM/yyyy HH24:MI:ss")

有关重载的更多信息,请阅读:Custom Date and Time Format Strings

答案 1 :(得分:1)

您的类型已经DateTime,并且由于这些类型与支持数据*相关联,因此可能不应更改它们。但是,如果你在API上返回值,你可以真正返回任何你想要的东西。所以匿名类型可以是一个快速解决方案:

.Select(o => new // <--- notice no type definition here
{
    Id = o.Id,
    FileName = o.FileName,
    ImportMessage = o.ImportMessage,
    ImportStatus = o.ImportStatus,
    ImportTimeStamp = o.ImportTimeStamp.ToString()
})

编译器将根据.ToString()返回的类型知道您希望ImportTimeStamp为字符串。然后,您可以add formatters to .ToString()根据需要自定义输出。

*如果您的DTO 实际上与数据库无关,那么您当然可以将其中的类型从DateTime更改为string。从所显示的代码的上下文来看,这些是数据 DTO还是应用程序 DTO是不是很清楚。