2010-12-06 65 views
8

J'essaie de trouver la meilleure façon de requête dans NHibernate de sorte que les résultats retournés sont entre les entrées où aujourd'hui le temps est> = PublishDateTime et < = ExpiryDateTimeInterrogation avec NHibernate où la date d'aujourd'hui se situe entre PublishDate et date d'expiration

La date d'expiration peut être nulle, donc je dois le permettre. J'ai trouvé quelques exemples here et here mais ils semblent fonctionner de manière différente et accepter 2 valeurs et les comparer à un champ de base de données. Je veux vraiment le contraire.

Interrogation jusqu'à présent:

var query = _session.CreateCriteria<Message>() 
       .AddOrder(Order.Desc("PublishedDateTime")) 
       .List<Message>(); 
       return query; 

Toutes les suggestions seraient grandement reçues!

Répondre

16

requête Linq Easiest:

return _session.Query<Message>() 
       .Where(m => DateTime.Today >= m.PublishDateTime && 
          (m.ExpiryDateTime == null || 
          DateTime.Now <= m.ExpiryDateTime) 
       .OrderByDescending(m => m.PublishDateTime) 
       .ToList(); 

Critères:

return _session.CreateCriteria<Message>() 
       .Add(Restrictions.Le("PublishedDateTime", DateTime.Today) & 
            (Restrictions.IsNull("ExpiryDateTime") | 
            Restrictions.Ge("ExpiryDateTime", 
                DateTime.Now))) 
       .AddOrder(Order.Desc("PublishedDateTime")) 
       .List<Message>(); 
+0

+1 merci. Linq je nouveau, mais a été intéressé par la méthode des critères donc merci – Andrew

+0

Faites-moi une faveur juste changer. Aujourd'hui à. Maintenant et je vais vous marquer comme la réponse. Merci encore pour votre contribution :) – Andrew

+0

Je pensais que vous vouliez "date d'aujourd'hui", pas "l'heure actuelle" (c'est ce que dit la question) –

0

en C#: pour donner deux exemples

  var formato = "dd/MM/yyyy h:mm:ss"; 
      var sDesde = DateTime.Now.ToString("dd/MM/yyyy") + " 0:00:00"; 
      var sHasta = DateTime.Now.ToString("dd/MM/yyyy h:mm:ss"); 

      Viaje vDesde = new Viaje { Viajefecha = DateTime.ParseExact(sDesde, formato , null) }; 
      Viaje vHasta = new Viaje { Viajefecha = DateTime.ParseExact(sHasta, formato, null) }; 

      StringWriter strWriter = new StringWriter(); 
      var resultado = cp.sesion.CreateCriteria<Viaje>().Add(Expression.Between("Viajefecha", vDesde.Viajefecha, vHasta.Viajefecha)).AddOrder(Order.Asc("Viajefecha")).List<Viaje>(); 
+0

eles preferem comme gambiarras, vai por mim! –