数据传输对象和报告

时间:2012-06-05 06:48:11

标签: c# .net oop design-patterns data-transfer-objects

我有这些情景:

//This class maps to the "Item" table in the database
public class Item
{
   public int itemID { get; set;}
   public string itemName { get; set; }
   public int quantity { get; set; }
}

//Items record are returned from the database as list    
List<Item> items = ItemDAO.GetItems();

我想生成一个包含聚合值的报告(来自查询/存储过程)

ItemID| ItemName | Qty | QtySoldThisMonth | QtySoldThisYr
-----------------------------------------------------------
123   | Vit. C   |  20 |   55             |    400
239   | Maloxin  |  25 |   12             |    210

Item类没有这些额外的字段 对于可能具有不同数量的列但我使用列表

的数据表,这会更容易

拜托,我该怎么做呢

3 个答案:

答案 0 :(得分:1)

您始终可以专门为该聚合视图创建另一个DTO,并在报告中使用它。

对于每个视图,比特定DTO更通用的解决方案是为Item上的报表创建DTO,并使用字段集合而不是类属性来在DTO中存储聚合值。

例如:

 class AggregatedReportField {
     public string FieldName { get; set; }
     public decimal FieldValue { get; set; }
 }

 class ItemReportDTO {

     public Dictionary<string, AggregatedReportField> ReportFields { get; private set; }

     public ItemReportDTO()
     {
         ReportFields = new Dictionary<string, AggregatedReportField>();
     }

     public void Add(AggregatedReportField field)
     {
         if (!ReportFields.ContainsKey(fieldl.FieldName))
              ReportFields.Add(field.FieldName, field);
     }
 }
在DAO中,您将首先从数据库中获取值,为每个值创建AggregatedReportField实例,并将其添加为DTO的名称。在您的报告中,您必须使用DTO.ReportFields [“SomeValue”]引用您的聚合值.PieldValue。

上面的代码只是一个例子,包含一些不良做法(暴露的Dictionary&lt;&gt;)。

答案 1 :(得分:1)

我建议您将实体(如项目)和报告行(包含其他字段)分开。

我认为,您必须选择:

  1. 创建单独的类来表示每个报告(或报告的行)
  2. 创建表示所有报告的类(它将包含有关列和所有数据的元数据)
  3. 您应该选择什么取决于您的要求。这些报告可以在java代码中使用DAO和聚合值,也可以直接调用存储的函数而无需使用DAO。

答案 2 :(得分:1)

我认为在您的情况下,如果您想要一些BLL类库为DTO列表中的编译报告提供,您应该为报告创建专门的DTO。您所能做的就是使用类继承来避免冗余代码。这就是你能得到的最好的东西。

public class AggregatedItem:Item
{
public int QtyMonth {get;set;}
public int QtyYear {get;set;}
}

问候。