Как выполнить сравнение даты и части в EF
Я слышал, как люди говорят, что сравнение даты и времени не работает только из-за временной части, потому что у даты и времени есть временная часть.
в sql я всегда сравниваю дату и время таким образом, и он отлично работает
select * from employee
where convert(varchar,dob,112) > '20111201' // this yyyymmdd format.
Как я могу имитировать это в запросе LINQ?
2 ответа
Следует иметь в виду, что операции со структурами DateTime, представляющими столбцы базы данных, не переводятся в SQL. Таким образом, вы не можете написать запрос как:
from e in EfEmployeeContext
where e.DOB.Date > new DateTime(2011,12,01);
... потому что e.DOB представляет столбец DOB в базе данных, и EF не будет знать, как перевести под-свойство Date.
Тем не менее, есть простой обходной путь в зависимости от того, какие даты вы хотите:
Если вы хотите включить всех сотрудников, у которых есть DOB 12/01/2011, а также тех, кто родился после этой даты, просто запросите:
from e in EfEmployeeContext where e.DOB > new DateTime(2011,12,01);
Если вы хотите включить только сотрудников, родившихся после 12/01/2011, запросите:
from e in EfEmployeeContext where e.DOB >= new DateTime(2011,12,02);
Короче говоря, критерии, то есть постоянное или буквальное DateTime, с которым вы сравниваете, могут быть установлены по вашему усмотрению. Вы просто не можете вносить радикальные изменения в свойства, которые представляют столбцы БД в предикате where. Это означает, что вы не можете сравнить один столбец DateTime с проекцией другого столбца DateTime, например:
//get all employees that were hired in the first six months of the year
from e in EfEmployeeContext
where e.HireDate < new DateTime(e.HireDate.Year, 7, 1);
Если вы используете.NET 4 или выше, просто используйте EntityFunctions.TruncateTime
вспомогательный метод. Это переведет этот тип преобразования даты-времени в дату для вас.
from e in EfEmployeeContext
where EntityFunctions.TruncateTime(e.DOB) > new DateTime(2011,12,01);