Объекты передачи данных и отчетность

У меня есть эти сценарии:

//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 не имеет этих дополнительных полей. Это было бы проще с datatable, который может иметь различное количество столбцов, но я использую список

Пожалуйста, как бы я пошел по этому поводу

3 ответа

Решение

Вы всегда можете создать другое DTO специально для этого агрегированного представления и использовать его в своих отчетах.

Немного более общим решением, чем конкретный DTO для каждого представления, было бы создание DTO для отчетов по Item и использование коллекции полей вместо свойств класса для хранения статистических значений в 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.

приведенный выше код является лишь примером и содержит несколько плохих практик (открытый словарь<>).

Я думаю, в вашем случае, если вы хотите, чтобы какая-то библиотека классов BLL предоставляла вам скомпилированные отчеты в Списке DTO, вам следует создать специализированные DTO для отчетов. все, что вы можете сделать, это использовать наследование классов, чтобы избежать избыточного кода. Это все, что вы можете сделать в лучшем случае.

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

С уважением.

Я предлагаю вам разделить сущности (например, элемент) и строки отчета (которые содержат дополнительные поля).

Я думаю, что у вас есть варианты:

  1. Создайте отдельный класс для представления каждого отчета (или строки отчета)
  2. Создать класс для представления всех отчетов (он будет содержать метаданные о столбцах и все данные)

Что вы должны выбрать, зависит от ваших требований. Эти отчеты могут использовать DAO и статистические значения в коде Java, или вызывать хранимые функции напрямую, не работая с DAO.

Другие вопросы по тегам