Большая проблема в преобразовании строки в 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(по умолчанию
значения для этих типов)