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

500 Error when converting nullable DateTime to string in IQueryable

我有以下代码,我从数据库上下文中获取数据并将可为 null 的 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,
};

result 上的 ToList() 被执行时,我卡住了,浏览器在水下给我一个 500 内部服务器错误。

当我使用它时:DateOfUpdate = string.Empty 它工作得很好所以我可能在将 DateTime 转换为字符串时做错了。

知道如何解决这个问题吗?

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

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

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: LINQ to Entities does not recognize the method 'System.String ToString(System.String)' method, and this method cannot be translated into a store expression.

你可以这样做:

 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();

但是 这不是最佳解决方案,因为您最终实现了所有数据,这意味着所有 table 数据都将在您的应用程序中处理,除非table小.

所以最好的解决办法是:

从 Linq 查询中获取您需要的数据(只提供您需要的数据)。然后将这些数据具体化,按照你的需要格式化,然后展示给用户。

个人看法: 生成数据格式不应该是 Linq 查询的责任。这应该在应用程序的上层完成,或者至少在您实现数据后完成。