带有DomainService + Repository模式的DomainCollectionView

时间:2011-05-26 09:11:22

标签: silverlight repository-pattern wcf-ria-services

我在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个元素。 / p>

使用带有wcf ria service + repository模式的DomainCollectionView的最佳方法是什么,所以所有过滤和分页都将在服务器端进行,只有必要数量的数据会返回到silverlight?

谢谢!

1 个答案:

答案 0 :(得分:3)

分页仍然在服务器端发生,但它发生在框架级别。您仍然只向客户端提取10条记录。然而,你注意到的是你将140条记录拉到中间(网络)层。这是有问题的,但可能与将它们全部拉到客户端的程度不同。

使用存储库修复此问题的最简单方法是将pageIndex和pageSize作为参数传递给查询方法。不要在客户端上调用SoryAndPageBy,只需调用SortBy并通过查询传递view.PageIndex和view.PageSize值。另外,请不要忘记在查询中包含TotalEntityCount请求。