Estoy tratando de convertir DateTime a string con formato personalizado. Pero me muestra el error LINQ

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.

Aquí está mi código en el controlador:

public ActionResult DaywiseData(DateTime date)
{
    try
    {
        var att = db.Attendances
                 .Where(d => d.Date == date)
                 .Select(s => new AttendanceViewModel
                  {
                      Date = s.Date,
                      aa = DateTime.Parse(s.InTime.ToString()).ToString("HH:mm tt"),  //Error is not showing after removing this line
                      InTime = s.InTime,
                      OutTime = s.OutTime,
                      EmployeeName = s.Employee.Name,
                      EmployeeUsername = s.Employee.Username
                  })
                  .ToList();
         return Json(att);
     }
     catch (Exception ex)
     {
         return Json(ex.Message);
     }
}
2
Jaber Kibria 29 dic. 2016 a las 11:20

3 respuestas

La mejor respuesta

Su LINQ se traduce a una consulta SQL que no admite ToString (). Déjelo como DateTime y luego conviértalo a cadena. Algo como esto

public ActionResult DaywiseData(DateTime date)
{
    try
    {
        var att = db.Attendances
                 .Where(d => d.Date == date)
                 .Select(s => new AttendanceViewModel
                  {
                      Date = s.Date,
                      DateTime = s.InTime, //dateTime property
                      DateTimeString = string.Empty //string property
                      InTime = s.InTime,
                      OutTime = s.OutTime,
                      EmployeeName = s.Employee.Name,
                      EmployeeUsername = s.Employee.Username
                  })
                  .ToList();
         att.ForEach(a => a.DateTimeString = a.DateTime.ToString("HH:mm tt"));

         return Json(att);
     }
     catch (Exception ex)
     {
         return Json(ex.Message);
     }
}
2
Amit Kumar Ghosh 29 dic. 2016 a las 08:30

Obtendrá el error porque el Expression dentro de su selección se convierte a SQL y se ejecuta en el servidor de la Base de Datos y es por eso que no reconoce el método DateTime.Parse(s.InTime.ToString()).ToString("HH:mm tt"). Tu tienes dos opciones aquí:

Actualice su código para materializar el resultado de su consulta antes de hacer .Select:

var att = db.Attendances
     .Where(d => d.Date == date)
     .ToList() // Here
     .Select(s => new AttendanceViewModel
      {
          Date = s.Date,
          aa = DateTime.Parse(s.InTime.ToString()).ToString("HH:mm tt"),  //Error is not showing after removing this line
          InTime = s.InTime,
          OutTime = s.OutTime,
          EmployeeName = s.Employee.Name,
          EmployeeUsername = s.Employee.Username
      })
      .ToList();
return Json(att);

O usa la respuesta de @Nino

2
Nasreddine 29 dic. 2016 a las 08:28

Intente usar SqlFunctions.StringConvert; Me gusta esto;

aa = DateTime.Parse(SqlFunctions.StringConvert(s.InTime)),  //Error is not showing after removing this line
1
Mehmet 29 dic. 2016 a las 08:32