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

时间:2014-10-01 17:00:57

标签: c# linq entity-framework linq-to-entities

我必须以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

当我在ToString上应用pr.ReviewDate时,我会收到错误。

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

2 个答案:

答案 0 :(得分:13)

这是因为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上的属性的任何东西都可以绑定到它(假设在这种情况下它是单向绑定)。

答案 1 :(得分:1)

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

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

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