在IQueryable中将可为空的DateTime转换为字符串时出现500错误

时间:2018-10-19 13:14:28

标签: c# linq datetime dbcontext nullable

我有以下代码,从数据库上下文中获取数据并将可空的DateTime DateOfUpdate转换为字符串:

var result = from data in context.releventData
select new ReleventData
{
    Id = data.Id,
    Status = data.Status,
    DateOfUpdate = data.DateOfUpdate.HasValue ? data.DateOfUpdate.Value.ToString("dd-MM-yyyy") : string.Empty,
};

执行ToList()上的result时,我陷入了困境,浏览器在水下给了我一个500 Internal Server Error的信息。

当我使用以下命令时:DateOfUpdate = string.Empty可以正常工作,因此我可能在将DateTime转换为字符串时做错了。

有什么解决方法吗?

1 个答案:

答案 0 :(得分:3)

首先。据我所知,这不属于Linq查询aansluiting。它是什么 ? 其次,为什么不尝试首先调用.ToList()来实现数据,所以如果发生错误,您可以立即看到而不仅仅是500错误。

我想在Linq中调用.ToString("dd-MM-yyyy")并不是明智之举,因为Linq对该功能不满意。尝试先检索数据,然后将其转换为您的格式。 在您的情况下,您最终会收到此错误:

  

“ System.NotSupportedException”类型的异常发生在   EntityFramework.SqlServer.dll,但未在用户代码中处理

     

其他信息:LINQ to Entities无法识别该方法   'System.String ToString(System.String)'方法,该方法不能   被翻译成商店表情。

您可以执行以下操作:

 var result = context.releventData.ToList().Select(data => new ReleventData
 {
     Id = data.Id,
     Status = data.Status,
     DateOfUpdate = data.DateOfUpdate.HasValue ? data.DateOfUpdate.Value.ToString("dd-MM-yyyy") : string.Empty,
 }).ToList();

但是这不是最佳解决方案,因为最终会实现所有数据,这意味着所有表数据都将在您的应用程序中处理,除非表很小,否则这是过分的。

因此,最好的解决方案:

从Linq查询中获取所需的数据(仅所需的)。然后具体化这些数据并根据需要设置其格式,然后向用户显示。

我自己的观点: Linq查询不应负责生成数据格式。这应该在应用程序的上层完成,或者至少在实现数据之后完成。