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