Entity framework 将聚合选择表达式传递给动态Linq的GroupBy

Entity framework 将聚合选择表达式传递给动态Linq的GroupBy,entity-framework,dynamic-linq,Entity Framework,Dynamic Linq,我已经从我的代码中简化了下面的示例,希望不会因此而出现明显的编译错误。假设我有以下实体,而不是我实际拥有的实体,请假设我没有EF或模式问题,这只是一个示例: public class Company { public string GroupProperty {get;set;} public virtual ICollection<PricingForm> PricingForms {get;set;} } public class PricingForm { publ

我已经从我的代码中简化了下面的示例,希望不会因此而出现明显的编译错误。假设我有以下实体,而不是我实际拥有的实体,请假设我没有EF或模式问题,这只是一个示例:

public class Company
{
  public string GroupProperty {get;set;}
  public virtual ICollection<PricingForm> PricingForms {get;set;}
}
public class PricingForm
{
  public decimal Cost {get;set;}
}
分组时是什么类型?我尝试使用其他表达式,假设这是一个iGroup或IQueryable相同的错误。我试着只选择成本并将总和移动到选择器字符串中,即。Sum@0it作为值,似乎总是得到相同的错误

我最终尝试了以下几点:

Expression<Func<IEnumerable<Company>, decimal?>> exp = l => l.SelectMany(c => c.PricingForms).Sum(fr => fr.Cost);
因此,通过这种动态分组和注入我自己的select表达式,我应该假设“it”的数据类型是什么?这会起作用吗?

它的类型是iGroup,其中TKey是基于keySelector结果类型的动态类型,TElement是输入IQueryable的元素类型。幸运的是,IGrouping inherits是一个IEnumerable,所以只要知道输入元素类型,就可以安全地将选择器基于IEnumerable

换句话说,基于表达式的最后一次尝试是正确的

您收到的新错误是因为@0it生成EF不支持的调用。最简单的修复方法是使用扩展方法:

System.Linq.Dynamic.ParseException: 'Argument list incompatible with lambda expression'
Expression<Func<IEnumerable<Company>, decimal?>> exp = l => l.SelectMany(c => c.PricingForms).Sum(fr => fr.Cost);
The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
Expression<Func<Company, decimal?>> exp = c => c.PricingForms.Sum(fr => fr.Cost);
string selector = "new (it.Key as Key, @0(it) as Value)";
IQueryable grouping = query.GroupBy("it.GroupProperty", "it").Select(selector, exp);

// This would fix the EF invocation expression error
grouping = grouping.Provider.CreateQuery(grouping.Expression.Expand());

return grouping;