如何在Linq查询中将DateTime转换为String?

我必须以MMM dd,YYYY格式显示日期。

 var performancereviews = from pr in db.PerformanceReviews .Include(a => a.ReviewedByEmployee) select new PerformanceReviewsDTO { ReviewDate=pr.ReviewDate.ToString("MMM dd,yyyy"), EmployeeName=pr.ReviewedByEmployee.Name, JobTitle=pr.ReviewedByEmployee.JobTitle, ReviewerComments=pr.CommentsByReviewer, EmployeeComments=pr.CommentsByEmployee }; 

这是我得到的错误消息

ExceptionMessage:LINQ to Entities无法识别方法’System.String ToString(System.String)’方法,并且此方法无法转换为商店表达式。 ExceptionType:System.NotSupportedException

当我在pr.ReviewDate上应用ToString ,我得到错误。

请通过适当的解决方案指导我如何实现这一目标。 我知道在正常的C#编码中有几种选择,但在Linq我们怎么做。

发生这种情况是因为LINQ to Entities正在尝试将表达式树转换为SQL查询,而.ToString() 可以转换为SQL,而.ToString(string) 则不能 。 (SQL没有相同的字符串格式概念。)

要解决此问题,请不要在查询中执行格式化,在显示逻辑中执行它。 保持查询尽可能简单:

 select new PerformanceReviewsDTO { ReviewDate=pr.ReviewDate, EmployeeName=pr.ReviewedByEmployee.Name, JobTitle=pr.ReviewedByEmployee.JobTitle, ReviewerComments=pr.CommentsByReviewer, EmployeeComments=pr.CommentsByEmployee } 

在这种情况下, PerformanceReviewsDTO.ReviewDate仍然是DateTime值。 它不是格式化数据,只是携带它。 (就像DTO一样。)

然后,当您显示该值时,执行格式化。 例如,这是用于MVC视图吗?:

 @Model.ReviewDate.ToString("MMM dd,yyyy") 

您甚至可以为PerformanceReviewsDTO添加一个简单属性,用于格式化显示:

 public string FormattedReviewDate { get { return ReviewDate.ToString("MMM dd,yyyy"); } } 

然后,绑定到DTO上的属性的任何东西都可以绑定到它(假设在这种情况下它是单向绑定)。

我通常解决这个问题的方法是首先获取数据,然后在内存中选择它。

 var performancereviews = from pr in db.PerformanceReviews .Include(a => a.ReviewedByEmployee) .ToArray() .Select( ....); 

通过放置ToArray (或List或其他),它将完成sql查询部分,然后从内存中的集合中完成其余部分 – 这应该没问题。