2011-05-26 71 views
1

我有一個視圖模型在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?

謝謝!

回答

3

分頁仍在服務器端發生,但它發生在框架級別。您仍然只向客戶端提供10條記錄。但是,您注意到的是,您將140條記錄拖放到中間(網頁)層。這是有問題的,但可能不像將它們全部提供給客戶一樣。

解決此問題的最簡單方法是將pageIndex和pageSize作爲參數傳遞給您的查詢方法。不要在客戶端調用SoryAndPageBy,只需調用SortBy並通過查詢傳遞view.PageIndex和view.PageSize值。另外,請不要忘記在查詢中包含TotalEntityCount請求。

+0

謝謝您的回覆Sir.On客戶端,域上下文Load()方法將EntityQuery作爲參數。是否有可能在域服務端訪問此查詢,並可能適用於EF ObjectSet? – shkipper 2011-05-26 19:39:38

+0

不容易。如果你直接從你的倉庫返回一個IQueryable,然後從Query操作返回它將會被應用。除此之外,要正確執行將很難(除非你真的喜歡錶達式和AST)。對於基於非查詢的分頁來說,參數確實是最好的選擇。 – 2011-05-26 22:32:35