1

我有这些情况:

//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 类没有这些额外的字段 这对于可能具有不同列数的数据表会更容易,但我使用的是列表

请问,我该怎么做

4

3 回答 3

2

您始终可以专门为该聚合视图创建另一个 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"].FieldValue 引用您的聚合值。

上面的代码只是一个示例,其中包含一些不好的做法(暴露的 Dictionary<>)。

于 2012-06-05T06:56:49.950 回答
1

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

我认为,您必须选择:

  1. 创建单独的类来表示每个报告(或报告的行)
  2. 创建类来表示所有报告(它将包含有关列和所有数据的元数据)

你应该选择什么取决于你的要求。这些报告可以在 java 代码中使用 DAO 和聚合值,或者直接调用存储的函数而不使用 DAO。

于 2012-06-05T08:44:18.753 回答
1

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

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

问候。

于 2012-06-05T08:44:27.580 回答