我有一个存储库:
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;
}
感谢。
答案 0 :(得分:2)
我个人会返回IEnumerable<T>
或IList<T>
而不是ObservableCollection。很多时候,您可能不需要ObservableCollection<T>
的完整行为,在这种情况下,您需要投入的资源超过必要的资源。
我喜欢你的第二个实现 - 但是,要注意有一个潜在的缺点。有些人不喜欢从存储库返回延迟执行IEnumerable<T>
,因为它会延迟执行直到使用。虽然它具有可能节省资源的优势,特别是如果你最终没有使用部分或全部可枚举资源,这可能导致稍后发生异常(实际使用IEnumerable<T>
时),而不是在你的内部发生存储库自己。
如果这困扰你,你可以强制执行(即:致电ToList()
或类似)。
答案 1 :(得分:0)
如果您只是使用它来填充UI,我个人会返回IEnumerable<T>
。如果您不打算添加/删除项目,则无需返回List<T>
。