从存储库getitems方法返回总项数的最佳方法是什么

时间:2010-05-04 14:30:24

标签: c# repository parameters

我们有以下存储库方法

public IList<Foo> GetItems(int fooId, int pageIndex, int pageSize
, string sortField, string sortDir, out int totalItems)
{
// Some code
}

我的问题是:以这种方式使用out是否可以。我对out感到有些不舒服,但无法想出一个更好的方法来将其作为一个电话来写。

3 个答案:

答案 0 :(得分:1)

这个怎么样?

public class ItemsList
{
    public IList<Foo> Items { get; set; }
    public int TotalCount { get; set; }
}

public ItemsList GetItems(int fooId, int pageIndex, int pageSize, string sortField, string sortDir)
{
    return new ItemsList { Items = ..., TotalCount = ... };
}

您也可以存储其他信息。

public class ItemsList
{
    public IList<Foo> Items { get; set; }
    public int TotalCount { get; set; }
    public string SortField { get; set; }
    public string SortDirection { get; set; }
    public int PageIndex { get; set; }
    public int PageSize { get; set; }
}

甚至可以创建一个通用类。

答案 1 :(得分:1)

我找到了我正在寻找的答案,但不是来自评论。谢谢你的帮助。

事实证明,MVC大师Rob Conery不久前发布了关于使用PagedList的信息。这是优雅的模式,根据博客,ScottGu已经在演示中使用它。基本上,您不是使用IList<T>List<T>,而是使用IPagedList<T>PagedList<T>PagedList<T>: List<T>, IPagedList<T>.

public interface IPagedList
{
    int TotalCount { get; set; }
    int PageIndex  { get; set; }
    int PageSize { get; set; }
    bool IsPreviousPage { get; }
    bool IsNextPage { get; }   
}

还有更多代码,请查看Rob的博客。

http://blog.wekeroad.com/blog/aspnet-mvc-pagedlistt/

答案 2 :(得分:0)

我不明白你为什么要在一次通话中这样做。如果您需要针对单独的总计数调用优化存储库往返,我相信您过早地进行微优化,除非您已经测量了此特定调用是您的性能问题。如果你已经测量了它,那么我认为你的存储库存在更大的问题。

我个人会在上面公开Count的同一个对象上坚持使用简单的GetItems属性。

更新:要解决您的问题,有理由不将其设计为单个电话:

它使您的API更复杂,更模糊​​。 GetItems()主要意图(如上所述)是处理单页项目;为项目总数添加out参数会超出语义。

这是需要考虑的事项 - 如果我只关心项目的总数,我是否需要致电GetItems或者是否会有单独的方法?如果有一个单独的方法,为什么有两种方法可以访问相同的信息,是否可能会返回不同的结果?如果没有单独的结果,为什么我必须获取整页记录才能获得存储库中项目的总数?