问题描述
|
我有查询:
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\"),...
}