Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开-关闭方法将正确的实体属性映射到相关视图模型_C#_Asp.net_Entity Framework_Design Patterns_Webforms - Fatal编程技术网

C# 打开-关闭方法将正确的实体属性映射到相关视图模型

C# 打开-关闭方法将正确的实体属性映射到相关视图模型,c#,asp.net,entity-framework,design-patterns,webforms,C#,Asp.net,Entity Framework,Design Patterns,Webforms,我继承了一个现有的应用程序,它有一个SQL数据库视图列表,用于包含预处理结果数据的报表,这些数据按报表类型和值类型进行分解,然后仅用于显示每周数据 这些观点的一个例子是: PlannedByFooView PlannedByBarView ProgressByFooView ProgressByBarView 然后使用实体框架从这些数据库视图中获取相关实体,这些实体在应用程序中的各种位置都被使用,其中一部分被转换为数据表,并用作透视网格的数据源:( 它们具有一些类似的属性,如以下所示,这在所

我继承了一个现有的应用程序,它有一个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..minasfo、MinAsBar

我的问题是,现在我需要一种方法,根据所需的报告类型,实现EF中的一些视图模型。

目前,我看不到一个不涉及很多类的好的OCP方法,所以我正在寻找一些帮助,最好是一个不涉及大量嵌套switch语句的方法。

使用LINQ to实体获取大量数据行作为特定视图模型的示例思想:

对于按月计划和按Foo计划(PlannedCode仅限于此视图)

按周和按栏显示进度(ProgressDescription仅限于此视图)

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