【发布时间】:2015-04-08 10:15:48
【问题描述】:
我有一些统计代码,我想在各个地方使用这些代码来计算计划Results 的成功/失败百分比。我最近在代码中发现了一个错误,这是因为它在每个 LINQ 语句中都被复制,然后我决定最好使用通用代码来执行此操作。当然,问题在于,在 SQL Server 上执行普通函数时,会抛出 NotSupportedException,因为 SQL Server 中不存在该函数。
如何编写可在 SQL Server 上执行的可重用统计代码,或者这不可能?
这是我为Result写的代码
public class Result
{
public double CalculateSuccessRatePercentage()
{
return this.ExecutedCount == 0 ? 100 : ((this.ExecutedCount - this.FailedCount) * 100.0 / this.ExecutedCount);
}
public double CalculateCoveragePercentage()
{
return this.PresentCount == 0 ? 0 : (this.ExecutedCount * 100.0 / this.PresentCount);
}
}
而且是这样使用的(结果是IQueryable,并抛出异常):
schedule.SuccessRatePercentage = (int)Math.Ceiling(results.Average(r => r.CalculateSuccessRatePercentage()));
schedule.CoveragePercentage = (int)Math.Ceiling(results.Average(r => r.CalculateCoveragePercentage()));
或者像这样(可行,因为我们对单个结果执行此操作)
retSchedule.SuccessRatePercentage = (byte)Math.Ceiling(result.CalculateSuccessRatePercentage());
retSchedule.CoveragePercentage = (byte)Math.Ceiling(result.CalculateCoveragePercentage());
编辑
根据@Fred 的回答,我现在有以下代码,适用于IQueryable
schedule.SuccessRatePercentage = (int)Math.Ceiling(scheduleResults.Average(ScheduleResult.CalculateSuccessRatePercentageExpression()));
schedule.CoveragePercentage = (int)Math.Ceiling(scheduleResults.Average(ScheduleResult.CalculateCoveragePercentageExpression()));
唯一的问题,尽管是小问题,是此代码不适用于个别结果,即
retSchedule.SuccessRatePercentage = (byte)Math.Ceiling(/* How do I use it here for result */);
【问题讨论】:
-
能否包含变量的声明,以便我们查看它们的数据类型?
标签: c# linq linq-to-sql linq-to-entities