【问题标题】:Choosing the right Collection/List for my repository为我的存储库选择正确的集合/列表
【发布时间】:2023-03-28 14:48:01
【问题描述】:

我有一个仓库:

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

我在想(并且可能是错误的)我希望我的存储库返回一个准系统列表,然后将其转换为适合我在视图模型中需要的内容。我的想法正确吗?这是我的想法:

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;
}

谢谢。

【问题讨论】:

    标签: ienumerable observablecollection ilist


    【解决方案1】:

    我会亲自返回 IEnumerable&lt;T&gt;IList&lt;T&gt; 而不是 ObservableCollection。很多时候您可能不需要ObservableCollection&lt;T&gt; 的全部行为,在这种情况下,您投入的资源过多。

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

    如果这让您感到困扰,您可以强制执行(即:调用 ToList() 或类似的方法)。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2019-03-07
      • 2020-12-15
      • 2019-03-26
      相关资源
      最近更新 更多