C# 为GroupBy键选择器创建Linq到EF类型

C# 为GroupBy键选择器创建Linq到EF类型,c#,linq,entity-framework,lambda,expression-trees,C#,Linq,Entity Framework,Lambda,Expression Trees,使用NET4.5.1 在可枚举lambda编译中混合了Queryable的构造,将数据库中的所有内容都拉入内存。谢谢@Servy在那里的帮助 我在用表达式创建的GroupBy选择器中使用字典作为TKey。字典显然不能以这种方式使用,请参见第37行GetGroupByDictionary方法。尝试使用简单的对象数组并遇到类型转换问题,即EF需要基元或枚举。测试了Int的硬代码数组,但GroupBy的TKey选择器类型不由提供程序(即数据库)处理。查询表中的GroupBy如下所示: GroupBy

使用NET4.5.1

在可枚举lambda编译中混合了Queryable的构造,将数据库中的所有内容都拉入内存。谢谢@Servy在那里的帮助

我在用表达式创建的GroupBy选择器中使用字典作为TKey。字典显然不能以这种方式使用,请参见第37行GetGroupByDictionary方法。尝试使用简单的对象数组并遇到类型转换问题,即EF需要基元或枚举。测试了Int的硬代码数组,但GroupBy的TKey选择器类型不由提供程序(即数据库)处理。查询表中的GroupBy如下所示:

 GroupBy(Param_0 => 
   new [] {
     Convert(Param_0.Respondent.currentVisitYear),
     Convert(Param_0.Respondent.currentVisitMonth)
 })
我的意图是使用字典或数组来容纳未知数量的group by key选择器,即客户机决定分组什么,可以是一个属性,也可以是10个属性

从Linq到EF时,键选择器的这些类型是否有效/可用

如果我提前输入组的数量,那么匿名类型就可以了,比如:

 .GroupBy(x => 
    new { 
      Year = x.Respondent.currentVisitYear, 
      Month = x.Respondent.currentVisitMonth
    } 
  )
由于这一点,可以在运行时创建类型。这是我唯一的选择吗

更新 在Ethan J.Brown代码的帮助下,创建了一个类型,作为GroupBy子句的TSource结果。在中的第9行,我创建了一个iGroup,返回元组中的类型和表达式。在第24行,我创建Select子句的选择器表达式

一切都已编译,但使用以下选项时会爆炸:

 {"The LINQ expression node type 'Lambda' is not supported in LINQ to Entities."}
如果我删除动态类型,即用普通类型在GroupBy中硬编码内联lambda:

 GroupBy(x=> new CommonGroupBy( 
   Year : (int) x.Respondent.currentVisitYear,
   Month : (int) x.Respondent.currentVisitMonth
 )
并将选择器代码调整为返回,即CommonGroupBy而不是object:

 Expression<Func<IGrouping<CommonGroupBy, ChartJoin>, AveragePartySize>>

将内联lambda与数组new[]{}一起使用时出现提供程序错误。字典不是一种可接受的列表类型,元组的创建调用不被EF接受,并且它们的构造函数不能有参数,即GroupBy炸弹中的new[]{new TupleYear,x.responder.currentVisitYear…}.List以及new List{intx.responder.currentVisitYear,intx.responder.currentVisityMonth}因为基础提供程序不支持GroupBy的键选择器类型。现在可以使用了。稍后将发布我的代码。
 "Unable to cast the type 'System.Object' to type 'Year;Nullable`1;Month;Nullable`1;'. LINQ to Entities only supports casting EDM primitive or enumeration types."