2010-07-08 53 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)因爲我的視圖模型可能最終將其放入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

我個人會返回一個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 2010-07-08 21:24:04

0

就個人而言,如果您只是使用它來填充UI,我會返回一個IEnumerable<T>。如果您不打算添加/刪除項目,則無需返回List<T>