2017-04-21 5 views
1

J'ai une classe DateRange personnalisée et je veux simplement ajouter une nouvelle criture pour QueryOver, en créant une nouvelle méthode d'aide et en passant lambda qui contient le champ dont j'ai besoin et la plage de dates. Mais je ne peux pas comprendre comment transférer et transformer l'expression.Nhibernate QueryOver helper pour la plage de dates sans passer le nom du champ

public static IQueryOver<tRoot, tSubType> AddDateRangeCritery<tRoot,tSubType>(this IQueryOver<tRoot, tSubType> query, 
         System.Linq.Expressions.Expression<Func<tSubType, object>> expr, DatesRange range) 
    { 
     if (range?.minDate != null) 
      query.Where(??? >= range.minDate.Value); 
    } 

je tryed compiler l'expression, mais je pense que ce n'est pas la meilleure idée + ne peux pas comprendre comment se passer à params d'expression. Est-il possible de faire cela sans ICriterion? Je ne veux pas aller de cette façon car nous pouvons transmettre des biens et non des noms de champs, ce qui est plus stable.

Répondre

0

Si vous changez un peu la signature de la méthode, il devient assez facile:

public static IQueryOver<tRoot, tSubType> AddDateRangeCritery<tRoot, tSubType>(
    this IQueryOver<tRoot, tSubType> query, 
    System.Linq.Expressions.Expression<Func<tSubType, DateTime>> expr, 
    DatesRange range) 
{ 
    if (range?.minDate != null) 
    { 
     var propr = expr.Body; 
     var value = Expression.Constant(range.minDate.Value); 
     var cmp = Expression.GreaterThanOrEqual(propr, value); 
     var expr2 = Expression.Lambda<Func<tSubType, bool>>(cmp, expr.Parameters); 
     query.Where(expr2); 
    } 

    return query; 
} 

J'ai changé l'expression de Func<tSubType, DateTime>. Si vous en avez réellement besoin, , object devient alors deux ou trois lignes de plus de code.

+0

Thx! Cela marche. Mon mauvais, je ne savais pas comment travailler avec des expressions, et passer des paramètres de l'entrée d'expression. –