2009-10-30 4 views
0

Je tente de générer un arbre Expression qui appelle finalement une série de méthodes GroupBy sur le type Enumerable.Besoin d'aide pour créer Linq.Expression à Enumerable.GroupBy

En forme simplifiée je tente quelque chose comme ceci:

IEnumerable<Data> list = new List<Data>{new Data{Name = "A", Age=10}, 
    new Data{Name = "A", Age=12}, 
    new Data{Name = "B", Age=20}, 
    new Data{Name="C", Age=15}}; 

Expression data = Expression.Parameter(typeof(IEnumerable<Data>), "data"); 
Expression arg = Expression.Parameter(typeof(Data), "arg"); 
Expression nameProperty = Expression.PropertyOrField(arg, "Name"); 

Expression group = Expression.Call(typeof(Enumerable), "GroupBy", new Type[] { typeof(Data), typeof(string) }, data, nameProperty); 

L'appel à Expression.Call à la fin jette « Aucune méthode « GroupBy » du type « System.Linq.Enumerable » est compatible avec le arguments fournis. "

Je fais une chose similaire, d'une manière similaire avec Enumerable.OrderBy avec succès et suis perplexe.

Toute aide est appréciée.

Répondre

1

n'avez-vous pas besoin de passer un lambda dans le second type? ainsi.

public void Test() 
    { 
     IEnumerable<Data> list = new List<Data> 
     { 
      new Data{Name = "A", Age=10}, 
      new Data{Name = "A", Age=12}, 
      new Data{Name = "B", Age=20}, 
      new Data{Name= "C", Age=15} 
     }; 


     var data = Expression.Parameter(typeof(IEnumerable<Data>), "data"); 
     var arg = Expression.Parameter(typeof(Data), "arg"); 
     var nameProperty = Expression.PropertyOrField(arg, "Name"); 
     var lambda = Expression.Lambda<Func<Data, string>>(nameProperty, arg); 

     var expression = Expression.Call(
      typeof(Enumerable), 
      "GroupBy", 
      new Type[] { typeof(Data), typeof(string) }, 
      data, 
      lambda); 

     //expected = {data.GroupBy(arg => arg.Name)} 
    } 
+0

qui a fonctionné. Je vous remercie – dkackman

Questions connexes