2010-03-04 3 views
5

J'ai un Expression<Func<T,DateTime>> Je veux prendre la partie DateTime de l'expression et retirer le mois de celle-ci. Donc, je le transformerais en un Expression<Func<T,int>> Je ne suis pas vraiment sûr de savoir comment faire cela. J'ai regardé le ExpressionTree Visitor mais je ne peux pas le faire fonctionner comme j'ai besoin. Voici un exemple de l'expression_dateheureCréer une nouvelle expression à partir d'une expression existante

DateTimeExpression http://img442.imageshack.us/img442/6545/datetimeexpression.png

Voici un exemple de ce que je veux créer MonthExpression http://img203.imageshack.us/img203/8013/datetimemonthexpression.png

On dirait que je dois créer une nouvelle MemberExpression qui se compose du mois propriété de l'expression DateTime mais je ne suis pas sûr.

+0

Où puis-je obtenir l'Expression Tree Viewer que vous utilisez? Cela fonctionne-t-il pour Visual Studio 2010? – MartinF

+0

Il est livré avec les échantillons Linq. Il y a un bon exemple d'utilisation ici http://linqinaction.net/blogs/jwooley/archive/2008/08/24/enabling-the-expression-tree-visualizer-in-visual-studio-2008.aspx Je n'ai pas Je l'ai essayé dans Studio 2010 mais je sais que ça fonctionne en 2008. – Adam

Répondre

8

Oui, c'est exactement ce que vous voulez - et en utilisant Expression.Property est la meilleure façon de le faire:

Expression func = Expression.Property(existingFunc.Body, "Month"); 
Expression<Func<T, int>> lambda = 
    Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters); 

Je crois que cela devrait être correct. Cela fonctionne dans ce test simple:

using System; 
using System.Linq.Expressions; 

class Person 
{ 
    public DateTime Birthday { get; set; } 
} 

class Test 
{ 
    static void Main() 
    { 
     Person jon = new Person 
     { 
      Birthday = new DateTime(1976, 6, 19) 
     }; 

     Expression<Func<Person,DateTime>> dateTimeExtract = p => p.Birthday; 
     var monthExtract = ExtractMonth(dateTimeExtract); 
     var compiled = monthExtract.Compile(); 
     Console.WriteLine(compiled(jon)); 
    } 

    static Expression<Func<T,int>> ExtractMonth<T> 
     (Expression<Func<T,DateTime>> existingFunc) 
    { 
     Expression func = Expression.Property(existingFunc.Body, "Month"); 
     Expression<Func<T, int>> lambda = 
      Expression.Lambda<Func<T, int>>(func, existingFunc.Parameters); 
     return lambda; 
    }           
} 
+0

A travaillé parfaitement. Merci Jon. – Adam

Questions connexes