¿Cómo puedo convertir DateTime a String en Linq Query?

Tengo que mostrar la fecha en formato 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 }; 

Aquí está el mensaje de error que estoy recibiendo

ExceptionMessage: LINQ to Entities no reconoce el método ‘System.String ToString (System.String)’, y este método no se puede traducir a una expresión de tienda. ExceptionType: System.NotSupportedException

Cuando aplico ToString en pr.ReviewDate obtengo errores.

Por favor guíeme con la solución adecuada, ¿cómo puedo lograr esto? Sé que en la encoding normal de C # hay varias opciones disponibles, pero en Linq, ¿cómo podemos hacerlo?

Esto sucede porque LINQ to Entities está intentando convertir el árbol de expresiones en una consulta SQL, y mientras .ToString() puede traducirse a SQL, .ToString(string) no puede . (SQL no tiene los mismos conceptos de formato de cadena.)

Para resolver esto, no realice el formateo en la consulta, hágalo en la lógica de visualización. Mantenga la consulta lo más simple posible:

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

En este caso, PerformanceReviewsDTO.ReviewDate sigue siendo un valor DateTime . No es formatear los datos, solo llevarlos. (Como un DTO debería).

Luego, cuando visualice el valor, realice el formateo. Por ejemplo, ¿se está utilizando esto en una vista MVC ?:

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

Incluso podría agregar una propiedad simple a PerformanceReviewsDTO para la pantalla formateada:

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

Entonces, lo que sea que esté vinculado a las propiedades en el DTO puede simplemente unirse a eso (asumiendo que es un enlace unidireccional en este caso).

La forma en que generalmente resuelvo este problema es primero obteniendo los datos y luego seleccionándolos en la memoria ‘.

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

Al poner ToArray (o Listar o lo que sea), finalizará la parte de consulta de SQL y luego hará el rest de la colección en la memoria, lo que debería estar bien.