Пакетные запросы для DomainContext с услугами RIA - PullRequest
0 голосов
/ 21 марта 2012

У меня есть простая веб-страница Silverlight, которая отображает dtaa из удаленной базы данных, используя службы RIA.У меня есть DomainContext, в котором я делаю запросы к базе данных через.

context.Load(context.GetSitesQuery()).Completed += new EventHandler(Query_Completed);

Обратите внимание, что я слушаю, чтобы запрос завершился.Проблема здесь в том, что мне нужно сделать как минимум 20 разных запросов, каждый из которых включает в себя разные объекты.Приложение действительно не может сделать много, пока все данные не будут загружены.Итак, мне бы очень хотелось знать, когда все запросы будут завершены.Существует ли простой способ создания пакета запросов?

Я пробовал это самостоятельно, но столкнулся с проблемой из-за того, что каждый запрос включает в себя отдельную сущность.Я создал список EntityQuery<Entity> и решил, что мог бы перебрать его и выполнить все запросы, но метод Load либо жалуется на неверные параметры, либо не работает во время выполнения.

1 Ответ

0 голосов
/ 22 марта 2012

Мы выполнили то, что вы хотите сделать, отследив количество ожидающих операций загрузки. Когда он достигает 0, вы фактически закончите.

using System.ServiceModel.DomainServices.Client;

...

private int _loadCounter;
private TheDomainContext _domainContext;

private void Load<TEntity>(EntityQuery<TEntity> query,
                           Action<LoadOperation<TEntity>> callback)
                       where TEntity : Entity
{
    BeginLoading();
    Action<LoadOperation<TEntity>> internalCallback = 
            loadOp => {
                          callback(loadOP);
                          EndLoading();
                      };
    _domainContext.Load(query, internalCallback , null);
}

private void BeginLoading()
{
    _loadCounter++;
    // You could add logic to indicate the app is busy
}

private void EndLoading()
{
    _loadCounter--;
    if (_loadCounter == 0)
    {
        OnLoadComplete();
    }
}

private void OnLoadComplete()
{
    // TODO Everything is loaded
}

private void BeginLoadingTheQueries()
{
    // Increment once here to prevent the OnLoadComplete from occurring
    // before all queries have started
    BeginLoading();
    Load(_domainContext.GetSitesQuery(), Query_Completed);
    Load(_domainContext.GetOtherQuery(), OtherQuery_Completed);
    EndLoading();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...