gran problema al convertir cadena a fecha y hora usando linq-to-entities

¿Cómo puedo convertir la cadena a datetime usando linq para entidades …?

Tengo la siguiente consulta, donde el tipo de datos de la columna visit_date es una cadena …

 var memberl = from v in abc.visits join m in abc.members on v.member_Id equals m.member_Id where Convert.ToDateTime(v.visit_Date) >= startdate && Convert.ToDateTime(v.visit_Date) <= enddate group m by new { m.member_Firstname, m.member_Lastname, m.member_Id } into g orderby g.Count() select new { numVisits = g.Count(), firstname = g.Key.member_Firstname, lastname = g.Key.member_Lastname }; 

Desafortunadamente no puedo cambiar el esquema …

Tengo el error:

 linq to entites does not recognise Convert.ToDatetime method 

¿Hay alguna solución posible para convertir cadenas a Datetime?

Código actualizado:

según solicitud He actualizado mi pregunta

  var data = (from v in abc.visits join m in abc.members on v.member_Id equals m.member_Id select new { MemberID = v.member_Id, VisiteDate = v.visit_Date, FirstName = m.member_Firstname, LastName = m.member_Lastname }).ToList(); var membersdata = from d in data where Convert.ToDateTime(d.VisiteDate) >= startdate && Convert.ToDateTime(d.VisiteDate) <= enddate group m by new { d.FirstName, d.LastName, d.MemberID } into g orderby g.Count() select new { numVisits = g.Count(), firstname = g.Key.FirstName, lastname = g.Key.LastName }; 

No creo que EF soporte una traducción para un String to DateTime o viceversa.

Según lo veo, tienes dos opciones, dependiendo del formato de la fecha en el campo de cadena:

Si el formato es bastante simple, una comparación de cadenas podría ser suficiente:

 // Convert the boundaries to strings first // TODO: Set the ToString format option to match the database format string startDateAsString = startdate.ToString("yyyyMMdd"); string endDateAsString = enddate.ToString("yyyyMMdd"); // Query based on string comparison var memberl = from v in abc.visits join m in abc.members on v.member_Id equals m.member_Id where v.visit_Date.CompareTo(startDateAsString) >= 0 && v.visit_Date.CompareTo(endDateAsString) <= 0 group m by new { m.member_Firstname, m.member_Lastname, m.member_Id } into g orderby g.Count() select new { numVisits = g.Count(), firstname = g.Key.member_Firstname, lastname = g.Key.member_Lastname }; 

Si la representación de cadena de la fecha es más compleja y una simple comparación de cadenas no puede ayudar, puede considerar crear una view en la tabla de visits , que hace la conversión para usted a nivel de base de datos:

 CREATE VIEW VisitsWithDate (MemberId, VisitDate) AS SELECT MemberId, Convert(datetime, VisitDate, 112) -- For instance FROM Visits 

Seguido por la importación de esta vista en su DataModel. Es posible que necesites hacer algo de magia para que las relaciones funcionen.

Espero eso ayude.

Convert.ToDatetime es compatible con Linq2SQL. El único método admitido de Linq para las entidades son estos: http://msdn.microsoft.com/en-us/library/bb738681.aspx

sobre su problema … intente convertir startdate y enddate en una cadena y compare el valor de la cadena en la expresión de linq.

Intente convertir los resultados en una List<> primero y filtre los resultados de la lista:

 var data = (from v in abc.visits join m in abc.members on v.member_Id equals m.member_Id select new { MemberID = v.member_id, VisiteDate = v.visit_date, FirstName = m.member_FirstName, LastName = m.member_LastName }).ToList(); var memberl = from d in data where Convert.ToDateTime(d.VisitDate) >= startdate && Convert.ToDateTime(d.VisitDate) <= enddate group d by new { d.FirstName, d.LastName, d.MemberID } into g orderby g.Count() select new { numVisits = g.Count(), firstname = g.Key.FirstName, lastname = g.Key.LastName }; 

Como DateTime y DateTimeOffset son estructuras, no son intrínsecamente anulables. Cuando necesita nulability, hay dos formas de evitar esto:

  1. Use un tipo Nullable (es decir, DateTime? O DateTimeOffset?).
  2. Utilice el campo estático DateTime.MinValue o DateTimeOffset.MinValue (los valores predeterminados para estos tipos)