2010-10-12 7 views
2

J'ai une classe avec une propriété DateTimeOffset:comparaison LINQ DateTimeOffset aujourd'hui

public class Sample 
{ 
    public DateTimeOffset expires { get; set; } 
} 

et, éventuellement, une collection d'entre eux:

IEnumerable<Sample> collection; 

2 questions:

  1. Quelle est la meilleure façon de créer une méthode qui retourne tous les Sampl Les articles de la collection où expire est plus grand que maintenant et est encore aujourd'hui (c.-à-d. avant minuit)?

  2. Quelle est la meilleure façon de renvoyer tous les exemples d'éléments de la collection où expire dans les prochaines 24 heures?

Répondre

2
// greater than now, still today    
collection.Where(d => d.expires.DateTime > DateTime.Now && d.expires.Date == DateTime.Today); 

// expires in the next 24 hours 
collection.Where(d => d.expires.DateTime > DateTime.Now && d.expires.DateTime < DateTime.Now.AddHours(24)); 
+0

Merci pour la réponse, mais cela ne fonctionne pas lorsque d.expires est un DateTimeOffset comme mentionné dans la question. – Chris

+0

Ok, essayez à nouveau, j'ai ajusté les requêtes pour compenser le type. Désolé, j'ai manqué cela – danijels

0
var list1 = 
    collection.Where 
     (c => c.expires.DateTime > DateTime.Now && 
       c.expires.DateTime < DateTime.Today.AddDays(1)); 

var list2 = 
    collection.Where 
     (c => c.expires.DateTime >= DateTime.Now && 
       c.expires.DateTime <= DateTime.Now.AddHours(24)); 
+0

Merci pour la réponse, mais cela ne fonctionne pas lorsque c.expires est un DateTimeOffset comme mentionné dans la question – Chris

-1

Il est une bonne pratique de "cache" les valeurs calculées pour la performance, sinon il serait calculé dans chaque boucle (comme D'où vient une boucle interne):

DateTime tomorrow = DateTime.Today.AddDays(1); 
DateTime now = DateTime.Now; 
DateTime next24hrs = now.AddHours(24); 
IEnumerable<Sample> next24HoursSamples = collection.Where(sample=>sample.expires>now && sample.expires<next24hrs).ToList(); 
IEnumerable<Sample> sameDaySamples = next24HoursSamples.Where(sample=>sample.expires>=now && sample.expires<tomorrow).ToList(); 

Notez que la liste sameDay est extraite de la liste déjà filtrée (le même jour est un sous-ensemble des prochaines 24 heures), donc il y a moins d'éléments à filtrer.

EDIT: J'ai mis à jour le code pour utiliser un modèle d'exécution de requête immédiate, car @danijels avertit de l'exécution différée.

+0

Je ne pense pas que ce soit très sage. Lorsque Linq diffère l'exécution, le calcul des valeurs DateTime et leur transmission à Linq signifie qu'en théorie, au moment où l'exécution est réellement effectuée, les valeurs peuvent avoir changé. Il suffit de considérer ce code en cours d'exécution secondes avant minuit et une certaine opération entre le démarrage d'une nouvelle journée, et tout est faux. Ne pas mentionner si cela devait être dans une requête linq compilée. – danijels

+0

Cela pourrait être vrai théoriquement, mais pratiquement l'exécution différée pourrait aussi couler à minuit et tout foirer. Ce n'est qu'une bonne pratique, ce n'est pas une règle. – jaraics

Questions connexes