我的任务是将一个页面添加到我们尚未构建但负责处理的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; }
}
答案 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是不是很清楚。