使用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."