Сравнение дат, игнорирование года - Linq / Entity Framework - PullRequest
3 голосов
/ 17 февраля 2011

Есть ли простой способ сравнить даты, которые игнорируют год, используя Linq и Entity Framework?

Скажите, у меня есть следующее

var result = context.SomeEntity.Where(e => e.SomeDate > startDate);

Это предполагает, что SomeDate и startDate.NET DateTime's.

Я хотел бы сравнить эти даты без сравнения года.SomeDate может быть в любой год.Есть ли простой способ сделать это?Единственный способ, о котором я мог бы подумать, - это использовать следующее:

var result = context.SomeEntity(e => 
    e.SomeDate.Month > startDate.Month ||
    (e.SomeDate.Month == startDate.Month && e.SomeDate.Day >= startDate));

Этот метод быстро усложняется, если я тоже хочу иметь endDate, так как мне придется делать такие вещи, как учестькогда начальная дата находится в конце года, а конечная дата в начале.

Есть ли простой способ сделать это?

Обновление:

Я закончил тем, что пошел по этому пути, как я изначально думал в посте ... чертовски много кода для чего-то концептуально простого.По сути, просто нужно было найти, попала ли дата в диапазон, игнорировать год и зациклить календарь, если startDate> endDate. Если кто-нибудь знает более простой способ, пожалуйста, напишите, как я все еще заинтересован.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Немного проще выглядит

var result = context.SomeEntity(e => 
    e.SomeDate.Month * 100 + e.SomeDate.Day > startDate.Month * 100 + startDate.Day
);

Вы также можете создать пользовательскую функцию (при условии, что используется сервер SQL), и эту функцию можно использовать в запросе.

0 голосов
/ 17 февраля 2011

Если вам действительно нужно сравнивать только даты (не раз), тогда может помочь свойство DateTime.DayOfYear. Но вы должны быть осторожны с високосными годами в этом случае. Кроме этого, я не могу представить ничего более простого, чем ваш подход к сравнению месяцев и месяцев.

Если все, что вас волнует, это то, что этот метод станет более сложным после введения второго сравнения, тогда простой метод извлечения должен помочь.

Другим подходом может быть создание метода расширения, который будет возвращать число, применимое для вашего сравнения. Например, давайте назовем этот метод GetYearIgnoringOrdinal():

public static int GetYearIgnoringOrdinal(this DateTime date)
{
    return date.Month*100 + date.Day;
}

А затем используйте это так:

var result = context.SomeEntity.Where(e => e.SomeDate.GetYearIgnoringOrdinal() > startDate.GetYearIgnoringOrdinal());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...