为我的存储库选择正确的Collection / List

时间:2010-07-08 20:48:59

标签: ienumerable observablecollection ilist

我有一个存储库:

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中,具体取决于我的需要。例如,我可能会将数据从上面的存储库返回到只读数据网格或下拉列表,或者我可能希望在可编辑的数据网格中使用相同的数据。

我在想(也可能是错的)我希望我的存储库返回一个准系统列表,然后将其转换为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 个答案:

答案 0 :(得分:2)

我个人会返回IEnumerable<T>IList<T>而不是ObservableCollection。很多时候,您可能不需要ObservableCollection<T>的完整行为,在这种情况下,您需要投入的资源超过必要的资源。

我喜欢你的第二个实现 - 但是,要注意有一个潜在的缺点。有些人不喜欢从存储库返回延迟执行IEnumerable<T>,因为它会延迟执行直到使用。虽然它具有可能节省资源的优势,特别是如果你最终没有使用部分或全部可枚举资源,这可能导致稍后发生异常(实际使用IEnumerable<T>时),而不是在你的内部发生存储库自己。

如果这困扰你,你可以强制执行(即:致电ToList()或类似)。

答案 1 :(得分:0)

如果您只是使用它来填充UI,我个人会返回IEnumerable<T>。如果您不打算添加/删除项目,则无需返回List<T>