DomainCollectionView с шаблоном DomainService + Repository - PullRequest
1 голос
/ 26 мая 2011

У меня есть модель просмотра в Silverlight, которая загружает контакты, т.е.

_ContactsSource = new EntityList<ContactItem>(_ContactsDomainContext.ContactItems);
_ContactsLoader = new DomainCollectionViewLoader<ContactItem>(LoadCurrentCategoryContacts, LoadContactsCompleted);
_ContactsView = new DomainCollectionView<ContactItem>(_ContactsLoader, _ContactsSource);

    public LoadOperation<ContactItem> LoadCurrentCategoryContacts()
    {
        var query = _ContactsDomainContext.GetContactsByCategoryIdQuery(CurrentContactCategory.Id);
        query.IncludeTotalCount = true;

        var op = _ContactsDomainContext.Load(query.SortAndPageBy(_ContactsView));
        return op;
    }

    public void LoadContactsCompleted(LoadOperation<ContactItem> op)
    {
        if (op.HasError)
            op.MarkErrorAsHandled();
        else if (!op.IsCanceled)
        {
            _ContactsSource.Source = op.Entities;

            if (op.TotalEntityCount > -1)
                _ContactsView.SetTotalItemCount(op.TotalEntityCount);
        }
    }

и доменный сервис с методом, который возвращает контакты DTO в зависимости от их категории:

   public IQueryable<ContactItem> GetContactsByCategoryId(int categoryId)
    {
        List<ContactItem> result = new List<ContactItem>();
        Mapper.Map(_contactRepository.GetAll(x => x.ContactCategoryId == categoryId), result); //automapper
        return result.AsQueryable();
    }

вопрос такой: каждый раз, когда доменная служба используется, она получает все строки таблицы из базы данных (т. е. для _ContactsView PageSize установлено значение 10, в результате «return result.AsQueryable ();» будет иметь 140 элементов), но отображаются только 10 элементов. 1007 *

Каков наилучший способ использования DomainCollectionView с шаблоном wcf ria service + repository, чтобы вся фильтрация и подкачка страниц выполнялись на стороне сервера, и только Silverlight возвращал только необходимый объем данных?

Спасибо!

1 Ответ

3 голосов
/ 26 мая 2011

Пейджинг все еще происходит на стороне сервера, но это происходит на уровне платформы. Вы все еще тянете только 10 записей к клиенту. Однако вы заметили, что вы тянете 140 записей на средний (веб) уровень. Это проблематично, но, скорее всего, не в той же степени, что и тянет их всех к клиенту.

Самый простой способ исправить это с вашим репозиторием - передать pageIndex и pageSize в качестве параметров вашему методу запроса. Вместо вызова SoryAndPageBy на клиенте, просто вызовите SortBy и передайте значения view.PageIndex и view.PageSize через запрос. Кроме того, не забудьте включить запрос TotalEntityCount в ваш запрос.

...