有没有办法将几种支持的Linq to Entity方法提取重构为一种方法?

问题描述

| 我有查询
ctx.PrintJobs
.GroupBy(pj => pj.Department.Name)
.Select(g => new PrintJobReportItem
{
    A3SizePercentage = g.Sum(p => p.DocumentSize == \"a3\" ? p.TotalPhisicalPages : 0d) / g.Sum(p => p.TotalPhisicalPages) * 100,...
}
而且有效。 我有很多要计算的Perecentage值,因此我尝试将这段代码重构为:
ctx.PrintJobs
.GroupBy(pj => pj.Department.Name)
.Select(g => new PrintJobReportItem
{
    A3SizePercentage = g.PercentageOf(p => p.DocumentSize == \"a3\"),...
}
...
public static class GroupingEx
{
    public static double PercentageOf(this IGrouping<string,PrintJobItem> g,Func<PrintJobItem,bool> trueCondition)
    {
        return g.Sum(p => trueCondition(p) ? p.TotalPhisicalPages : 0d) / g.Sum(p => p.TotalPhisicalPages) * 100;
    }
}
但是后来我得到了错误
System.NotSupportedException : LINQ to Entities does not recognize the method \'Double PercentageOf...
我了解为什么我会收到此错误。 还有其他方法可以将Linq 2实体支持方法提取为单个方法吗?还是我的堆栈粘贴了相同的代码位? Linq 2对象不是选项     

解决方法

        在ESQL中(将内联函数复制到多个ESQL查询-示例),这是可能的;如果使用EDMX,可以在Linq-to-entities中定义模型定义的函数。据我所知,代码首先(= no EDMX)不支持-在这种情况下,您必须使用@Daniel提到的方法,在该方法中实现结果并使用linq-to-objects执行您的方法。     ,        您可以首先从数据库中获取数据,然后对本地数据使用您的方法:
ctx.PrintJobs.GroupBy(pj => pj.Department.Name)
             .ToList()
             .Select(g => new PrintJobReportItem
                          {
                              A3SizePercentage = 
                                  g.PercentageOf(p => p.DocumentSize == \"a3\"),...
                          }