所以我在DAL中使用所有指南和教程描述的存储过程实现了objectDataSource自定义分页,但我意识到通过将自定义分页逻辑放在数据访问层,你的数量是有限的可以使用您的域模型。
例如,我有一个带有gridview的webform,我希望显示属于特定Office(OfficeId)的每个Customer(CustomerId)及其Order(OrderId)的状态(如果有)。
所以在我的服务层,我可以填写一个DTO列表(我是DDD的新手,所以我确定这个设计并不好,但请耐心等待):
ObjectDataSource SelectMethod绑定到:
public List<CustomerAndOrderDTO> GetCustomersByOffice(int officeId, int startPageIndex, int maxiumRows)
{
List<CustomerAndOrderDTO> customerAndOrderDTO = null;
List<Customer> customers = Customer.GetCustomersByOffice(int officeId);
foreach (Customer customer in customers)
{
customerAndOrderDTO.Add(new CustomerAndOrderDTO(customer));
}
return customerAndOrderDTO;
}
这是DTO课程:
public CustomerAndOrderDTO
{
public int OrderId {get; set;}
public int CustomerId {get; set;}
public CustomerAndOrderDTO(Customer customer)
{
CustomerId = customer.Id;
Order order = customer.GetOrder();
OrderId = order.Id;
}
}
非常简单的代码,您可以在BLL中获得域模型的所有灵活性和强大功能以及验证和持久性检查。
即使您想忽略在域中聚合对象的好处,只需要在存储过程级别组合数据,例如select * from Customers left join Orders on .... left join Office on ... where。 ...你最终会编写一百万个扩展方法,为每个可能的组合实现分页,例如CustomersOrdersByOfficePaged,CustomersOrdersByAccountDatePaged等......
所以我开始做错了吗?或者在服务层进行分页是否有意义?如果是这样,那么如何实现呢?
答案 0 :(得分:0)
看一下Dynamic LINQ。
这可以帮助你:
我希望这有帮助!
答案 1 :(得分:0)
所以,我敢肯定,从图像的角度来看,这不是最好的架构,但要在服务级别实现分页,您只需从数据访问级别查询对象,然后在您的上实现分页逻辑您的BLL级别的对象列表如下:
if ((startRowIndex != 0 && startRowIndex != null)
&& (maximumRows != 0 && maximumRows != null))
{
if ((audits.Count - startRowIndex) < maximumRows)
{
audits = audits.GetRange((int)startRowIndex, audits.Count - (int)startRowIndex);
}
else
{
audits = audits.GetRange((int)startRowIndex, (int)maximumRows);
}
}
return audits;
objectDataSource所需的Count方法采用与主“Get”方法相同的参数,并调用“Get”方法,然后返回.Count。
同样,不是最好的方法,但要完成工作。