2011-02-17 5 views
2

Existe-t-il un moyen simple de comparer des dates, qui ignore l'année, en utilisant Linq et Entity Framework?Comparer des dates, en ignorant l'année - Linq/Entity Framework

Dire que j'ai les suivantes

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

Cela suppose que SomeDate et startDate sont .NET DateTime de.

Ce que je voudrais faire est de comparer ces dates sans comparer l'année. SomeDate peut être n'importe quelle année. Y a-t-il un moyen facile de faire cela? La seule façon que je pouvais penser serait d'utiliser les éléments suivants:

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

Cette méthode devient rapidement plus complexe si je suis à la recherche d'avoir un endDate aussi bien, que je vais devoir faire des choses comme compte prendre pour quand la date de début est à la fin de l'année et la date de fin est au début.

Existe-t-il un moyen facile d'y parvenir?

Mise à jour:

J'ai fini par aller juste à ce sujet comme je l'avais d'abord pensé à la poste ... un diable de beaucoup de code pour quelque chose sur le plan conceptuel simple. Fondamentalement, il suffit de trouver si une date est tombée dans une fourchette, en ignorant l'année, et en boucle le calendrier si startDate> endDate Si quelqu'un connaît un moyen plus facile, s'il vous plaît envoyer comme je suis toujours intéressé.

Répondre

0

Si vous avez vraiment besoin de comparer uniquement les dates (pas les temps), la propriété DateTime.DayOfYear peut vous aider. Mais vous devriez être prudent en ce qui concerne les années bissextiles dans ce cas. D'autre part, je ne peux pas imaginer quelque chose de plus simple que votre approche en comparant les mois et les jours. Si tout ce qui vous intéresse est que cette méthode deviendra plus compliquée après l'introduction de la seconde comparaison, alors l'extraction de méthode simple devrait aider.

Une autre approche pourrait être de créer une méthode d'extension qui retournera un nombre applicable pour votre comparaison. Par exemple, nous allons appeler cette méthode GetYearIgnoringOrdinal():

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

Et puis l'utiliser comme ceci:

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

'DayOfYear' n'est pas pris en charge dans LINQ to Entities. – bunglestink

+1

Je ne pense pas que vous pouvez utiliser les méthodes d'extension non plus ... – bunglestink

+0

@bunglestink avez-vous déjà résolu cela? Je pense à forcer une requête sql si ef me donne l'enfer – GotaloveCode

1

recherche un peu plus simple façon

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

Vous pouvez également créer une fonction définie par l'utilisateur (en supposant SQL Server est utilisé) et cette fonction peut être utilisée dans la requête.