我有这些情景:
//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类没有这些额外的字段 对于可能具有不同数量的列但我使用列表
的数据表,这会更容易拜托,我该怎么做呢
答案 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)
我建议您将实体(如项目)和报告行(包含其他字段)分开。
我认为,您必须选择:
您应该选择什么取决于您的要求。这些报告可以在java代码中使用DAO和聚合值,也可以直接调用存储的函数而无需使用DAO。
答案 2 :(得分:1)
我认为在您的情况下,如果您想要一些BLL类库为DTO列表中的编译报告提供,您应该为报告创建专门的DTO。您所能做的就是使用类继承来避免冗余代码。这就是你能得到的最好的东西。
public class AggregatedItem:Item
{
public int QtyMonth {get;set;}
public int QtyYear {get;set;}
}
问候。