RIA Service - Пользовательский запрос - PullRequest
0 голосов
/ 05 сентября 2011

У меня какая-то дилемма.

Пытаясь запросить мою БД через службу RIA из моего клиента Silverlight, я столкнулся со следующей проблемой. Целью является получение списка меню и подменю. (Примечание: у меня есть только список меню на 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, я получаю результат.

Метод My Service для нерабочей версии выглядит следующим образом:

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

У кого-нибудь есть идеи, почему эта кровавая штука не работает?

Большое спасибо заранее! С уважением, Том

1 Ответ

1 голос
/ 05 сентября 2011

Ваша "загрузочная" версия не (и не может) ожидает загрузки данных. Этот метод Load является асинхронным вызовом, и возвращаемое значение немедленно содержит пустую коллекцию сущностей.

Версия IEnumerable возвращает запрос отложенной загрузки, поэтому он загружает данные при использовании.

Я хотел бы посмотреть, как вы принимаете вызов на LoadMenusByParentID, прежде чем предлагать конкретный совет, но в основном вам нужно переработать потребителя, чтобы использовать асинхронные данные (или придерживаться отложенной загрузки)

...