Open Closed方法将正确的实体属性映射到相关的视图模型

时间:2013-07-17 11:49:16

标签: c# asp.net entity-framework design-patterns webforms

我继承了一个现有的应用程序,其中包含用于报表的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, 
            ... 
    });

按周和按Bar进行进度(ProgressDescription仅限于此视图)

myDbContext
    .ProgressByWeekView
    .Select(
        x => new ProgressViewModel { 
            ProgressDescription = x.ProgressDescription, 
            Period = x.Period, 
            Quantity = x.QuantityAsBar, 
            ... 
    });

0 个答案:

没有答案