我有一個視圖模型在Silverlight它加載接觸,即:DomainCollectionView用的DomainService + Repository模式
_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?
謝謝!
謝謝您的回覆Sir.On客戶端,域上下文Load()方法將EntityQuery作爲參數。是否有可能在域服務端訪問此查詢,並可能適用於EF ObjectSet? – shkipper 2011-05-26 19:39:38
不容易。如果你直接從你的倉庫返回一個IQueryable,然後從Query操作返回它將會被應用。除此之外,要正確執行將很難(除非你真的喜歡錶達式和AST)。對於基於非查詢的分頁來說,參數確實是最好的選擇。 – 2011-05-26 22:32:35