使用Net 4.5.1
进入一个problem,其中包含Queryable的构造,该构造混合了Enumerable lambda编译,这些编译将数据库中的所有东西都拉到了内存中。感谢@Servy的帮助。
我在使用表达式创建的GroupBy选择器中使用字典作为TKey。字典显然无法以这种方式使用(请参阅gist第37行 GetGroupByDictionary 方法)。尝试使用简单的对象数组并遇到类型转换问题(即EF期望原始或Enum)。测试了Int的硬代码数组,但GroupBy的TKey选择器类型不由提供者(即数据库)处理。 Queryable中的GroupBy看起来像:
GroupBy(Param_0 =>
new [] {
Convert(Param_0.Respondent.currentVisitYear),
Convert(Param_0.Respondent.currentVisitMonth)
})
我的意图是使用字典或数组来容纳未知数量的分组键选择器(即客户端决定分组的内容可以是一个属性或10个)。
从Linq到EF时,键选择器的这些类型是否可以有效/使用?
如果我提前新建了一个匿名类型的分组数,那就像:
.GroupBy(x =>
new {
Year = x.Respondent.currentVisitYear,
Month = x.Respondent.currentVisitMonth
}
)
可以在运行时创建类型(感谢此example)。这是我唯一的选择吗?
更新 在Ethan J. Brown的代码的帮助下制作了一个gist来动态创建一个类型作为GroupBy子句的TSource结果。在Calling Method的第9行,我创建了IGrouping,在元组中返回类型和表达式。在第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>>
然后查询运行。动态类型中的东西是不对的。
更新2 上述错误是由Group by stuff文件中的第32行引起的。现在正在与下一个错误作斗争:
"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."