2012-06-05 3 views
0

У меня есть этот сценарий:Передача данных объектов и отчетность

//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 

Класс товара не имеет эти дополнительные поля Это было бы проще с datatable, который мог бы иметь различное количество столбцов, но я использую список

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

+0

Почему вы не используете анонимные типы? http://beyondrelational.com/modules/2/blogs/61/posts/11203/anonymous-types-in-c-or-vb-net.aspx –

+0

QtySoldThisMonth и QtySoldThisYr являются сгенерированными значениями. для этого не может быть столбца. У вас есть столбец «Дата» в таблице? – Pranalee

+0

@Pranalee, почему дата столбца? Я знаю, как получить эти значения, отображать их в моем отчете - проблема – codingbiz

ответ

1

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

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

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

+0

, что означает, что для каждого варианта моего отчета мне нужно создать новый DTO? – codingbiz

+0

вы можете пойти так, да. Я обновил свой ответ другим, более общим решением, используя словарь <>. –

+0

очень вдумчивый - спасибо – codingbiz

1

Предлагаю вам отделить объекты (как элемент) и строки отчетов (содержащие дополнительные поля).

Я думаю, что вы должны вариантов:

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

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

1

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

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

С уважением.

+0

Я уже думал об этом ... многоразовый. благодаря – codingbiz

Смежные вопросы