2009-10-30 188 views
0

我正在尝试生成一个表达式树,最终调用Enumerable类型的一系列GroupBy方法。需要帮助创建Linq.Expression到Enumerable.GroupBy

以简单的形式,我试图这样的事情:

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); 

呼叫在年底Expression.Call抛出“没有方法上键入'的GroupBy‘System.Linq.Enumerable’与兼容提供的参数。“

我正在做类似的事情,以类似的方式与Enumerable.OrderBy成功和难住。

任何帮助表示赞赏。

回答

1

您是否需要将lambda作为第二种类型传入?像这样。

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

工作。谢谢 – dkackman 2009-10-30 16:20:06