【问题标题】:DomainCollectionView with DomainService + Repository pattern具有 DomainService + Repository 模式的 DomainCollectionView
【发布时间】:2011-09-02 10:22:21
【问题描述】:

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

将 DomainCollectionView 与 wcf ria 服务 + 存储库模式一起使用的最佳方式是什么,这样所有的过滤和分页都将在服务器端进行,并且只会将必要的数据量返回给 silverlight?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复先生。在客户端,域上下文 Load() 方法以 EntityQuery 作为参数。是否可以在域服务端访问此查询并可能适用于 EF ObjectSet?
    • 不容易。如果您直接从存储库返回 IQueryable,然后从 Query 操作返回它,它将被应用。除此之外,要正确地做到这一点非常困难(除非你真的喜欢表达式和 AST)。参数确实是非基于查询的分页的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多