У меня есть два значения даты, одно из которых уже хранится в базе данных, а другое выбрано пользователем с помощью DatePicker. Вариант использования - поиск определенной даты в базе данных.
Значение, ранее введенное в базу данных, всегда имеет компонент времени 12:00:00, тогда как дата, введенная из средства выбора, имеет другой компонент времени.
Меня интересуют только компоненты даты и я хотел бы игнорировать компонент времени.
Как можно провести это сравнение в C #?
Кроме того, как это сделать в LINQ?
ОБНОВЛЕНИЕ: в LINQ to Entities отлично работает следующее.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
c#
linq
entity-framework
linq-to-entities
datetime-comparison
pencilslate
источник
источник
Ответы:
ПРИМЕЧАНИЕ: на момент написания этого ответа EF-отношение было неясным (это было отредактировано в вопрос после того, как это было написано). Для правильного подхода с EF отметьте ответ Mandeeps .
Вы можете использовать
DateTime.Date
свойство для сравнения только по дате.источник
EntityFunctions.TruncateTime
определенно, похоже, это правильный путь в наши дни (он стал доступен в .NET 4, который был выпущен через год после того, как был задан этот вопрос).Используйте класс
EntityFunctions
для обрезки временной части.Источник: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
ОБНОВИТЬ
Начиная с EF 6.0 и более поздних версий EntityFunctions заменяется DbFunctions .
источник
EntityFunctions
устарело в пользуSystem.Data.Entity.DbFunctions
(по крайней мере) EF6. Возможно, это было раньше.Думаю, это могло бы вам помочь.
Я сделал расширение, так как мне нужно сравнивать даты в репозиториях, заполненных данными EF, и поэтому .Date не был вариантом, поскольку он не реализован в переводе LinqToEntities.
Вот код:
тогда вы можете использовать его таким образом.
источник
Если вы используете
Date
свойство для сущностей БД, вы получите исключение:Вы можете использовать что-то вроде этого:
источник
Чтобы сделать это в LINQ to Entities, вы должны использовать поддерживаемые методы :
Уродливо, но это работает, и это делается на сервере БД.
источник
Вот другой способ сделать это, но он полезен, только если SecondDate - это переменная, которую вы передаете:
Я думаю, это должно сработать
источник
DateTime = x.Date;
мне не хватало. Если бы я использовалvar
или имел значение, встроенное в сравнение, это не удалось с сообщением об исключении. Спасибо.e.FirstDate.Value <= endDate
на,e.FirstDate.Value < endDate
вы можете удалить.AddTicks(-1)
.Вы также можете использовать это:
DbFunctions.DiffDays(date1, date2) == 0
источник
вы можете использовать для этого метод DbFunctions.TruncateTime ().
источник
Просто всегда сравнивайте свойство Date DateTime, а не полное время.
Когда вы делаете свой LINQ-запрос, используйте date.Date в запросе, то есть:
источник
candidate.Date >= base.Date
. Теоретическиcandidate.Date
время должно быть> = 12:00:00, поэтому использование свойства Date излишне, но я буду придерживаться совета Рида.Вот как я это делаю.
источник
// Примечание для пользователей / кодеров Linq
Это должно дать вам точное сравнение для проверки, попадает ли дата в диапазон при работе с вводом от пользователя - например, средство выбора даты:
где startdate и enddate - значения из средства выбора даты.
источник
Без времени попробуйте вот так:
источник
Вы можете использовать ссылку ниже, чтобы сравнить 2 даты без времени:
функция сравнения возвращает 3 разных значения: -1 0 1, что означает dt1> dt2, dt1 = dt2, dt1
источник
Попробуйте это ... Он отлично подходит для сравнения свойств Date между двумя типами DateTimes:
PS. Это временное решение и действительно плохая практика, никогда не следует использовать, когда вы знаете, что база данных может принести тысячи записей ...
источник