Вы можете выполнить это с Насмешкой в.NET. Однако нет никакой поддержки в языке этой функции, я думаю, что это будет доступно в C# 4.0. Существует много библиотек там для Насмешки, включая:
Почему бы не сохранить день рождения в локальной переменной, изменить год на текущий год, а затем проверить, наступит ли он в следующие 20 дней?
public bool IsBirthdayInNextTwentyDays(DateTime actualBirthday)
{
var birthday = actualBirthday;
birthday.Year = DateTime.Now.Year;
return birthday > DateTime.Now && birthday < DateTime.Now.AddDays(20);
}
Затем в Linq что-то вроде:
user.Where(u => IsBirthDayInNextTwentyDays(u.Birthday));
Доброта,
Дэн
Вот один способ сделать это. Мне не очень нравится, как сначала вычисляют день рождения «в этом году», а потом исправляют его, если он уже прошел, но я не мог придумать лучшего способа за короткое время.
from p in Persons
let thisYearsBirthday = p.Birthdate.AddYears(today.Year - p.Birthdate.Year)
// OR this way, although the SQL it produces it a little less simple
// let thisYearsBirthday = new DateTime(today.Year, p.Birthdate.Month, p.Birthdate.Day)
let nextBirthday = (thisYearsBirthday >= today) ? thisYearsBirthday : thisYearsBirthday.AddYears(1)
where nextBirthday >= today && nextBirthday <= today.AddDays(20)
select new { /* ... */ };
Используйте свойство DateTime.DayOfYear
, чтобы получить целое число; 1 января == 1, последний день года = 365/366.
В наивных версиях используется что-то вроде
where user.Birthday.DayOfYear - DateTime.Now.DayOfYear > 20
Это не работает, когда год заканчивается, когда текущий день приходится на конец декабря, а день рождения пользователя - на начало января. Но начните с DateTime.DayOfYear