C# RIA服务-自定义查询

C# RIA服务-自定义查询,c#,silverlight,dns,ria,C#,Silverlight,Dns,Ria,我有点进退两难 试图从silverlight客户端通过RIA服务查询数据库时,我遇到了以下问题。目标是获得菜单和子菜单的列表。(注意:我只有两级菜单列表,因此只有一个主菜单和多个子菜单,但这些子菜单不包含/不能包含其他子菜单) 第一部分: public void LoadMenus(Action<ObservableCollection<Menu>> callback) { _context.Load(_context.GetMenusQuery(

我有点进退两难

试图从silverlight客户端通过RIA服务查询数据库时,我遇到了以下问题。目标是获得菜单和子菜单的列表。(注意:我只有两级菜单列表,因此只有一个主菜单和多个子菜单,但这些子菜单不包含/不能包含其他子菜单)

第一部分:

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);
    }
公共无效加载菜单(操作回调)
{
_Load(_context.GetMenusQuery(),lo=>
{
变量菜单=新的EntityList(_context.menus,lo.Entities);
foreach(菜单中的var m.Where(x=>x.Parent==x.MenuID))
{
foreach(LoadMenusByParentID(m.MenuID))中的var sm
{
m、 子菜单添加(sm);
}
}
调用(菜单);
},空);
}
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);
    }
private IEnumerable LoadMenusByParentID(int-parentID)
{
var lo=_context.Load(_context.GetMenusByParentIDQuery(parentID));
var m=新的EntityList(_context.menu,lo.Entities);
返回m;
}
工作版本:

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);
    }
private IEnumerable LoadMenusByParentID(int-parentID)
{
返回上下文菜单,其中(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);
    }
公共IQueryable GetMenusByParentID(int parentID) { 返回ObjectContext.Menus.Where(m=>m.Parent==parentID&&m.MenuID!=parentID); } 有人知道为什么这该死的东西不起作用吗

非常感谢! 亲切问候,, Tom

您的“加载”版本不会(也不能)等待加载数据。该
Load
方法是一个异步调用,立即返回的值有一个空的Entities集合

IEnumerable版本返回一个延迟加载查询,因此在使用时加载数据


在提供具体建议之前,我想看看您是如何使用对
LoadMenusByParentID的调用的,但基本上您需要重新编写消费者以使用异步数据(或坚持延迟加载)

对LoadMenusByParentID的调用在“第一部分”中使用,这也是一个异步加载函数。抱歉,错过了那个小细节:)您现在基本上想要嵌套异步回调。此时,您的内部循环基本上是同步的。去掉LoadMenusByParentID包装器,并将带有回调的加载添加到顶级循环中。(嵌套/隐藏异步操作需要类或回调来提供上下文,而不仅仅是方法)。