Объекты передачи данных и отчетность
У меня есть эти сценарии:
//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;}
}
С уважением.
Я предлагаю вам разделить сущности (например, элемент) и строки отчета (которые содержат дополнительные поля).
Я думаю, что у вас есть варианты:
- Создайте отдельный класс для представления каждого отчета (или строки отчета)
- Создать класс для представления всех отчетов (он будет содержать метаданные о столбцах и все данные)
Что вы должны выбрать, зависит от ваших требований. Эти отчеты могут использовать DAO и статистические значения в коде Java, или вызывать хранимые функции напрямую, не работая с DAO.