Выбор правильной коллекции / списка для моего хранилища - PullRequest
0 голосов
/ 09 июля 2010

У меня есть репозиторий:

public ObservableCollection<ProjectExpenseBO> GetProjectExpenses()
{
    //Get by query
    IQueryable<ProjectExpenseBO> projectExpenseQuery =
       from p in _service.project_expense
       from e in _service.vw_employee 
       where p.employee_id == e.employee_id 
       select new ProjectExpenseBO()
       {
           ProjectExpenseID = p.project_expense_id
           , EmployeeID = p.employee_id
           , ProjectNumber = p.project_number
           , PurchaseTypeID = p.purchase_type_id
           , BuyerEmployeeID = p.buyer_employee_id
           , PurchaseOrderNumber = p.purchase_order_number
           , DeliveryDate = p.delivery_date
           , EmployeeName = e.first_name + " " + e.last_name
       };

    ObservableCollection<ProjectExpenseBO> projectExpenseCollection = new ObservableCollection<ProjectExpenseBO>(projectExpenseQuery);
    return projectExpenseCollection;
}

Мне интересно, лучше ли вернуть IList или IEnumerable (вместо ObservableCollection) из моего репозитория, так как моя view-модель может в конечном итоге поместить его вObservableCollection или List, в зависимости от моих потребностей.Например, я могу вернуть данные из репозитория выше в сетку данных или раскрывающийся список только для чтения, или я хочу, чтобы те же данные были в редактируемой сетке данных.

Я думаю (и могу ошибаться), что яЯ хочу, чтобы мой репозиторий возвращал список базовых элементов, а затем преобразовал его в то, что соответствует моим потребностям в модели представления.Правильно ли мое мышление?Вот о чем я думал:

public IEnumerable<ProjectExpenseBO> GetProjectExpenses()
{
    //Get by query
    IQueryable<ProjectExpenseBO> projectExpenseQuery =
       from p in _service.project_expense
       from e in _service.vw_employee 
       where p.employee_id == e.employee_id 
       select new ProjectExpenseBO()
       {
           ProjectExpenseID = p.project_expense_id
           , EmployeeID = p.employee_id
           , ProjectNumber = p.project_number
           , PurchaseTypeID = p.purchase_type_id
           , BuyerEmployeeID = p.buyer_employee_id
           , PurchaseOrderNumber = p.purchase_order_number
           , DeliveryDate = p.delivery_date
           , EmployeeName = e.first_name + " " + e.last_name
       };
    return projectExpenseQuery;
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

Я бы лично вернул IEnumerable<T> или IList<T> вместо ObservableCollection.Во многих случаях вам может не понадобиться полное поведение ObservableCollection<T>, и в этом случае вы вкладываете больше ресурсов, чем необходимо.

Мне нравится ваша вторая реализация - однако, учтите, что есть один потенциалоборотная сторона.Некоторым людям не нравится возвращать отложенное выполнение IEnumerable<T> из репозитория, поскольку оно откладывает выполнение до использования.Несмотря на то, что у него есть потенциал для потенциальной экономии ресурсов, особенно если вы в конечном итоге не используете некоторые или все перечисляемые, это может привести к исключению, возникающему позже (когда фактически используется IEnumerable<T>) вместо того, чтобы происходить внутри вашего хранилища самостоятельно..

Если это вас беспокоит, вы можете просто заставить выполнение произойти (то есть: вызвать ToList() или подобное).

0 голосов
/ 09 июля 2010

Лично я бы вернул IEnumerable<T>, если вы просто используете его для заполнения пользовательского интерфейса. Нет необходимости возвращать List<T>, если вы не собираетесь добавлять / удалять элементы из него.

...