2010-07-08 2 views
0

У меня есть репозиторий:Выбор правильного сбора/Список для моего репозитория

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) из моего репозитория, так как мой ViewModel может в конечном итоге вставьте его в ObservableCollection или List, в зависимости от моей потребности. Например, я могу вернуть данные из репозитория выше в список данных или раскрывающийся список только для чтения, или мне могут понадобиться те же данные в редактируемом datagrid.

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

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

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

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

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

+0

Спасибо! Мне нужно будет увидеть, как отложенное исполнение повлияет на мое приложение. Я нашел эту тему и вам нужно ее немного почитать: http://stackoverflow.com/questions/1168944/how-to-tell-if-an-ienumerablet-is-subject-to-deferred-execution – steveareeno

0

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