2011-11-25 3 views
0

Je veux construire une expression pour une clause WhereComment construire une expression <Func <T, bool> d'une autre expression (Expression <Func <T, DateTime>>)

Expression<Func<T, bool>> 

sur une méthode qui accepte un paramètre de type

Expression<Func<T, DateTime>> 

Je souhaite manipuler ma propriété DateTime pour comparer ses propriétés internes afin d'ajouter des clauses de comparaison aux propriétés de jour, de mois et d'année.

Ma méthode est comme ce qui suit:

public static class MyUtils 
{ 
    public static Expression<Func<T, bool>> GetTime<T>(this Expression<Func<T, bool>> pExp, Expression<Func<T, DateTime>> MyProperty, int day, int month, int year) 
    { 
    } 
} 

Je voudrais l'utiliser comme ceci:

Expression<Func<MyClass, bool>> vExpression = p => false; 
vExpression = vExpression.GetTime<MyClass>(c => c.MyDate, 21, 12, 2012); 

Ainsi, à la fin de la méthode que j'ai quelques comparaisons entre mon « MaDate "propriété et les valeurs de date individuelles.

Est-ce que cela peut être fait?

+0

Cela me semble normal, était-ce votre question? – Polity

+0

Je souhaite utiliser les propriétés Jour, Mois et Année –

Répondre

2

Peut-être quelque chose comme ceci:

static Expression<Func<T, bool>> GetTime<T>(
    Expression<Func<T, DateTime>> expression, 
    DateTime compare 
) 
{ 
    var comparison = Expression.Equal(expression.Body, Expression.Constant(compare)); 
    return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters); 
} 

Vous pouvez alors faire:

Expression<Func<MyClass, bool>> vExpression = GetTime<MyClass>(
    c => c.MyDate, 
    new DateTime(2012, 12, 21) 
); 

EDIT

Le code ci-dessus montre comment vous pouvez créer un nouvel arbre d'expression basé sur la le vieux. Vous pouvez créer votre nouvelle arborescence d'expression en utilisant toutes les constructions autorisées. Voici un exemple un peu plus compliqué:

static Expression<Func<T, bool>> GetTime<T>(
    Expression<Func<T, DateTime>> expression, 
    DateTime compare 
) 
{ 
    var comparison = Expression.AndAlso(
     Expression.AndAlso(
      Expression.GreaterThanOrEqual(
       Expression.Property(expression.Body, "Year"), 
       Expression.Constant(compare.Year) 
      ), 

      Expression.GreaterThanOrEqual(
       Expression.Property(expression.Body, "Month"), 
       Expression.Constant(compare.Month) 
      ) 
     ), 

     Expression.GreaterThanOrEqual(
      Expression.Property(expression.Body, "Day"), 
      Expression.Constant(compare.Day) 
     ) 
    ); 

    return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters); 
} 
+0

Désolé, je n'ai pas été assez clair, je veux manipuler les propriétés "Jour", "Mois" et "Année" indépendamment les unes des autres car je les utiliserai pour filtre entre les plages par exemple: dateProperty.Year> = 2011 && dateProperty.Year> = 2012 && dateProperty.Month> = 5 && dateProperty.Month> = 8 && dateProperty.Day> = 15 && dateProperty.Year> = 25 –

+0

Merci @Bojan, c'est ce que je cherchais. –

Questions connexes