Большая проблема в преобразовании строки в datetime с использованием linq-to-entity

Как преобразовать строку в datetime, используя linq для объектов....

У меня есть следующий запрос, где тип столбца visit_date - строка...

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
              };

К сожалению, я не могу изменить схему...

У меня есть ошибка:

linq to entites does not recognise Convert.ToDatetime method

Есть ли возможное решение для преобразования строки в Datetime?

Обновленный код:

согласно запросу Я обновил свой вопрос

 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
                        }; 

Ответ 1

Я не думаю, что EF поддерживает перевод для преобразования String в DateTime или наоборот.

Как я вижу, у вас есть два варианта, в зависимости от формата даты в поле строки:

Если формат довольно простой, может быть достаточно сравнения строк:

// 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
              };

Если строковое представление даты более сложное, и простое сравнение строк не может помочь, вы можете подумать о создании таблицы view в таблице visits, которая выполняет преобразование для вас на уровне базы данных:

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

После этого импортируется это представление в ваш DataModel. Возможно, вам понадобится сделать магию, чтобы заставить отношения работать.

Надеюсь, что это поможет.

Ответ 2

Сначала попробуйте преобразовать результаты в List<> и отфильтруйте результаты из списка:

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           
              }; 

Ответ 3

Convert.ToDatetime поддерживается Linq2SQL. Единственный поддерживаемый метод Linq для объектов: http://msdn.microsoft.com/en-us/library/bb738681.aspx

о вашей проблеме... попробуйте преобразовать startdate и enddate в строку и сравнить строковое значение в выражении linq.

Ответ 4

Поскольку DateTime и DateTimeOffset являются структурами, они не могут быть обнуляемы. Когда вам нужна нулеустойчивость, есть два пути:

  • Используйте тип Nullable (например, DateTime? или DateTimeOffset?).
  • Используйте статическое поле DateTime.MinValue или DateTimeOffset.MinValue(по умолчанию значения для этих типов)