我在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?
谢谢!
答案 0 :(得分:3)
分页仍然在服务器端发生,但它发生在框架级别。您仍然只向客户端提取10条记录。然而,你注意到的是你将140条记录拉到中间(网络)层。这是有问题的,但可能与将它们全部拉到客户端的程度不同。
使用存储库修复此问题的最简单方法是将pageIndex和pageSize作为参数传递给查询方法。不要在客户端上调用SoryAndPageBy,只需调用SortBy并通过查询传递view.PageIndex和view.PageSize值。另外,请不要忘记在查询中包含TotalEntityCount请求。