2011-09-05 46 views
0

我處於某種困境。RIA服務 - 自定義查詢

試圖通過我的Silverlight客戶端的RIA服務查詢我的數據庫,我遇到了以下問題。目標是獲取菜單和子菜單的列表。 (注意:我只有一個2級菜單列表,所以只有1個主菜單和多個子菜單,但是這些子菜單不包含/不能包含其他子菜單)。

第一部分:

public void LoadMenus(Action<ObservableCollection<Menu>> callback) 
    { 
     _context.Load(_context.GetMenusQuery(), lo => 
                { 
                 var menus = new EntityList<Menu>(_context.Menus, lo.Entities); 
                 foreach (var m in menus.Where(x => x.Parent == x.MenuID)) 
                 { 
                  foreach (var sm in LoadMenusByParentID(m.MenuID)) 
                  { 
                   m.SubMenus.Add(sm); 
                  } 
                 } 
                 callback.Invoke(menus); 
                }, null); 
    } 

的loadMenusByParentID非工作版本:

private IEnumerable<Menu> LoadMenusByParentID(int parentID) 
    { 
     var lo = _context.Load(_context.GetMenusByParentIDQuery(parentID)); 
     var m = new EntityList<Menu>(_context.Menus, lo.Entities); 
     return m; 
    } 

工作版本:

private IEnumerable<Menu> LoadMenusByParentID(int parentID) 
    { 
     return _context.Menus.Where(m => m.Parent == parentID && m.MenuID != parentID); 
    } 

試圖放下好的做法,我打算使用Load ()函數(也因爲它和異步操作)。但由於某種原因,我沒有得到它的結果,而當我LinqQuery上下文本身,我得到了一個結果。

我對非工作版本服務的方法是這樣的:

public IQueryable<Menu> GetMenusByParentID(int parentID) 
    { 
     return ObjectContext.Menus.Where(m => m.Parent == parentID && m.MenuID != parentID); 
    } 

任何人有,爲什麼血腥的東西是不工作的任何想法?

非常感謝提前! 親切的問候, 湯姆

回答

1

你的「負荷」版本不(也不能)等待數據加載。該Load方法是一個異步調用,並立即返回值具有一個空的實體集合。

IEnumerable版本會返回一個延遲加載查詢,所以它會在加載數據時使用。

我想看看你是如何消費的號召LoadMenusByParentID提供具體的建議之前,但基本上你需要返工的消費者使用異步數據(或延遲加載粘)

+0

到LoadMenusByParentID調用在「第一部分」中消耗,這也是一個異步加載函數。 –

+0

對不起,錯過了那個小細節:)你現在基本上想要嵌套你的異步回調。你的內部循環現在基本上是同步的。擺脫LoadMenusByParentID包裝並使用回調將該負載添加到頂級循環中。 (嵌套/隱藏異步操作需要類或回調來爲其提供上下文,而不僅僅是方法)。 –

+0

非常感謝:) –