我继承了一个现有的应用程序,该应用程序有一个 SQL 数据库视图列表,用于报表,这些报表充满了按报表类型和值类型分解的预处理结果数据,然后它们仅用于显示每周数据。
这些视图的一个示例是:
PlannedByFooView
PlannedByBarView
ProgressByFooView
ProgressByBarView
然后使用实体框架从这些数据库视图中获取相关实体,并且实体在应用程序中的各种位置使用,其中一部分被转换为数据表并用作数据透视网格的数据源:(
它们有一些类似的属性,如下所示,在所有报告中都是预期的
long ItemNumber { get; set; }
int Period { get; set; }
int Quantity { get; set; }
int Max { get; set; }
int Min { get; set; }
int Average { get; set; }
string Category { get; set; }
然后还有一些特定的属性,例如PlannedCode, ProgressDescription
可能出现在几个视图中或仅出现在其中一个视图中。
这是我现在需要支持的报告类型、值类型和新期间类型的示例。
public enum ReportTypes
{
Planned,
Progress,
Complete,
Released
}
public enum ReportValueTypes
{
Foo,
Bar,
Baz,
Qux
}
public enum ReportPeriodTypes
{
Week,
Month
}
作为一个示例,我已将数据库视图稍微更改为以下结构:
PlannedByMonthView
PlannedByWeekView
然后在每个视图中,它们都有相关的字段,即QuantityAsFoo, QuantityAsBar.. MinAsFoo, MinAsBar
等。
我的问题是,现在我需要一种方法来根据所需的报告类型从 EF 中具体化一些视图模型。
我目前看不到一种不涉及大量类的好 OCP 方法,因此我正在寻求一些帮助,最好是不涉及大量嵌套 switch 语句的方法。
使用 LINQ to Entities 获取大量数据行作为特定视图模型的示例想法:
对于按月和按 Foo 计划(PlannedCode 仅针对此视图)
myDbContext
.PlannedByMonthView
.Select(
x => new PlannedViewModel {
PlannedCode = x.PlannedCode,
Period = x.Period,
Quantity = x.QuantityAsFoo,
...
});
对于按周和按栏的进度(ProgressDescription 仅针对此视图)
myDbContext
.ProgressByWeekView
.Select(
x => new ProgressViewModel {
ProgressDescription = x.ProgressDescription,
Period = x.Period,
Quantity = x.QuantityAsBar,
...
});