使用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) . 这是我唯一的选择吗?
Update 在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>>
然后查询运行 . 动态类型中的东西是不正确的 .
Update 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."