これが私が持っているコードの非常に単純化されたバージョンです:
class PrintJob : IEntity
{
public string UserName { get; set; }
public string Departmen { get; set; }
public int PagesPrinted { get; set; }
}
class PrintJobReportItem
{
public int TotalPagesPrinted { get; set; }
public int AveragePagesPrinted { get; set; }
public int PercentOfSinglePagePrintJobs { get; set; }
}
class PrintJobByUserReportItem : PrintJobReportItem
{
public string UserName { get; set; }
}
class PrintJobByDepartmenReportItem : PrintJobReportItem
{
public string DepartmentName { get; set; }
public int NumberOfUsers { get; set; }
}
次に、2つのクエリがあります。
var repo = new Repository(...);
var q1 = repo.GetQuery<PrintJob>()
.GroupBy(pj => pj.UserName)
.Select(g => new PrintJobByUserReportItem
{
#region this is PrintJobReportItem properties
TotalPagesPrinted = g.Sum(p => p.PagesPrinted),
AveragePagesPrinted = g.Average(p => p.PagesPrinted),
PercentOfSinglePagePrintJobs = g.Count(p => p.PagesPrinted == 1) / (g.Count(p => p.PagesPrinted) != 0 ? g.Count(p => p.PagesPrinted) : 1) * 100,
#endregion
UserName = g.Key
});
var q2 = repo.GetQuery<PrintJob>()
.GroupBy(pj => pj.Departmen)
.Select(g => new PrintJobByDepartmenReportItem
{
#region this is PrintJobReportItem properties
TotalPagesPrinted = g.Sum(p => p.PagesPrinted),
AveragePagesPrinted = g.Average(p => p.PagesPrinted),
PercentOfSinglePagePrintJobs = g.Count(p => p.PagesPrinted == 1) / (g.Count(p => p.PagesPrinted) != 0 ? g.Count(p => p.PagesPrinted) : 1) * 100,
#endregion
DepartmentName = g.Key,
NumberOfUsers = g.Select(u => u.UserName).Distinct().Count()
});
TotalPagesPrinted、AveragePagesPrinted、PercentOfSinglePagePrintJobsに値を割り当てて再利用できるようにし、DRYの原則に従うように、パーツを抽出するための提案は何でしょうか。
私はEF4.1コードのみのアプローチを使用していますが、別のテクノロジーまたはアプローチに切り替えることはできません。また、そのデータをマテリアライズできません。グリッドコンポーネントが後でクエリするものを追加するため、クエリとして保持する必要があります。そのため、LinqtoObjectに切り替えることができません。