большая проблема в преобразовании строки в 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 };
К сожалению, я не могу изменить схему …
- Показать свойства навигационного свойства в DataGridView (свойства второго уровня)
- Лучшая практика для обработки исключений в приложении Windows Forms?
- Безопасно ли просто устанавливать CheckForIllegalCrossThreadCalls на false, чтобы избежать ошибок сквозной streamовой передачи во время отладки?
- как программно перемещать мышь, щелкнуть, правым кликом и нажатием клавиши и т. д. в winform и wpf?
- Winforms - нажмите / перетащить в любом месте формы, чтобы переместить его, как если бы щелкнул в заголовке формы
У меня есть ошибка:
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 };
- DataGridView привязан к словарю
- Бесплатный / открытый редактор исходного кода. Интерфейс пользовательского интерфейса для .Net
- Жирный текст в MessageBox
- Пользовательские заголовки / хром в приложении WinForms
- Создание Wizard для Windows Forms в C #
- Ужасная производительность перерисовки DataGridView на одном из моих двух экранов
- Самая верхняя форма, нажатие «через» возможно?
- Как я могу заставить Visual Studio 2008 Window Forms создать форму, которая реализует абстрактный базовый class?
Я не думаю, что EF поддерживает перевод для преобразования String to 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. Возможно, вам понадобится сделать магию, чтобы заставить отношения работать.
Надеюсь, поможет.
Convert.ToDatetime
поддерживается Linq2SQL. Единственный поддерживаемый метод Linq для сущностей: http://msdn.microsoft.com/en-us/library/bb738681.aspx
о вашей проблеме … попробуйте преобразовать startdate
и enddate
в строку и сравнить строковое значение в выражении linq.
Сначала попробуйте преобразовать результаты в 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 };
Поскольку DateTime и DateTimeOffset являются структурами, они не являются обнуляемыми. Когда вам нужна нулеустойчивость, есть два пути:
- Используйте тип Nullable (например, DateTime? Или DateTimeOffset?).
- Используйте статическое поле DateTime.MinValue или DateTimeOffset.MinValue (значения по умолчанию для этих типов)