Каков наилучший способ вернуть общее количество элементов из метода getitems из репозитория - PullRequest
1 голос
/ 04 мая 2010

У нас есть следующий метод хранилища

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

Мой вопрос: можно ли использовать out таким образом? Мне немного неудобно с out, но я не могу придумать лучшего способа записать это как один вызов.

Ответы [ 3 ]

1 голос
/ 04 мая 2010

Как насчет этого?

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 голос
/ 04 мая 2010

Я нашел ответ, который искал, но не из комментариев. Спасибо, правда, за вашу помощь.

Оказывается, что гуру MVC Роб Конери опубликовал некоторое время назад об использовании 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; }   
}

В ней больше кода, так что загляните в блог Роба.

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

0 голосов
/ 04 мая 2010

Я не понимаю, почему вы хотите сделать это за один звонок. Если вам нужно оптимизировать обратную передачу хранилища для отдельного вызова общего подсчета, я считаю, что вы преждевременно микрооптимизируете, если только вы не определили, что этот конкретный вызов является вашей проблемой перфорации. И если вы измерили это, и я считаю, что у вас больше проблем с вашим хранилищем.

Лично я бы придерживался простого свойства Count для того же объекта, который выставляет GetItems выше.

Обновление: Чтобы ответить на ваш вопрос, есть причины не использовать его как один вызов:

Это делает ваш API более сложным и неоднозначным, чем он должен быть. GetItems() основное намерение (как заявлено выше) состоит в том, чтобы иметь дело с одной страницей элементов; добавление параметра out для общего количества семантических перегрузок элементов, которые семантически.

Вот кое-что, чтобы рассмотреть - если я забочусь только об общем количестве предметов, я должен буду вызвать GetItems или будет отдельный метод? Если существует отдельный метод, почему существует два способа доступа к одной и той же информации и возможно ли, что они могут давать разные результаты? И если нет отдельного результата, почему я должен получать полную страницу записей только для того, чтобы получить общее количество элементов в хранилище?

...