2017-05-23 4 views
1

J'ai un champ DateTime nullable nommé Birthdate pour ma table de membre. J'ai besoin d'avoir des membres qui ont un anniversaire les n prochains jours. J'ai essayé quelques méthodes mais aucune d'entre elles n'a fonctionné.NHibernate comment obtenir des membres qui ont un anniversaire dans n jours suivants

DateTime startDate = DateTime.Now; 
DateTime endDate = DateTime.Now.AddDays(n); 

GetAll().Where(
    x => x.BirthDate != null 
    && new DateTime(startDate.Year, x.BirthDate.Value.Month, x.BirthDate.Value.Day, 1, 1, 1) >= startDate 
    && new DateTime(endDate.Year, x.BirthDate.Value.Month, x.BirthDate.Value.Day, 1, 1, 1) <= endDate 
    ); 

ne peut pas passer à x.BirthDate constructeur DateTime

GetAll().OrderByDescending(m => m.CreateDate) 
    .Where(x => x.BirthDate.HasValue 
     && (endDate - x.BirthDate.Value).Days <= n) 

jette erreur de reconnaissance.

Savez-vous un moyen simple et fonctionnel de le faire?

+0

Avez-vous essayé d'abord de voir ce que 'GetAll()' renvoie avant de commencer à le filtrer? – yoger

Répondre

0

prend en charge un groupe de propriétés sur DateTime et DateTimeOffset. Vous pouvez voir la liste . Le reference documentation aura un jour une section Linq dédiée aussi. (Déjà engagé, non encore publié.)

Alors, deviner votre GetAll donne un IQueryable, vous pouvez écrire votre requête de cette façon:

var startDate = DateTime.Now; 
var endDate = DateTime.Now.AddDays(n); 
if (startDate.Year == endDate.Year) 
{ 
    // Simple case, just compare months and days. 
    GetAll().Where(
     x => x.BirthDate.Value.Month >= startDate.Month && 
      x.BirthDate.Value.Day >= startDate.Day && 
      x.BirthDate.Value.Month <= endDate.Month && 
      x.BirthDate.Value.Day <= endDate.Day); 
} 
else 
{ 
    // Range spanning two distinct years, so matching dates 
    // are either lower months and days than endDate, OR 
    // greater months and days than startDate. (Cannot have both.) 
    GetAll().Where(
     x => x.BirthDate.Value.Month >= startDate.Month && 
      x.BirthDate.Value.Day >= startDate.Day || 
      x.BirthDate.Value.Month <= endDate.Month && 
      x.BirthDate.Value.Day <= endDate.Day); 

} 

J'ai supprimé le contrôle sur HasValue: si la requête est traduite SQL n'a pas besoin de SQL dans ce cas.

Il devrait fonctionner avec aussi, je crois qu'il prend en charge les mêmes propriétés DateTime.