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

时间:2014-12-11 09:31:21

标签: c# linq entity-framework lambda expression-trees

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

0 个答案:

没有答案