2011-09-05 45 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

非常感谢:) –