Запрос мобильного приложения Azure TableController

entity-framework azure xamarin azure-mobile-services

947 просмотра

2 ответа

519 Репутация автора

Я использую мобильные приложения Azure и TableControllers в своем проекте. Развитие шло довольно гладко, до сих пор. Одна из моих таблиц опирается на немного бизнес-логики, чтобы вернуть соответствующие объекты обратно клиенту. Для выполнения этой бизнес-логики мне нужно получить некоторые параметры от клиента (в частности, диапазон дат).

Я знаю, что мог бы использовать APIController для возврата данных, но не нарушит ли это синхронизацию сущностей, предоставляемую SyncTables в Xamarin?

Моя текущая логика в моем GetAll:

public IQueryable<WorkItemDTO> GetAllWorkItem()
    {
        //Return all the work items that the user owns or has been assigned as a resource.
        var query = MappedDomainManager.QueryEntity().Where(x => x.OwnerId == UserProfileId || x.Resources.Where(r => r.AssignedResourceId == UserProfileId).Count() > 0);

        return query.Project().To<WorkItemDTO>();
    }

Я хотел бы иметь возможность каким-то образом проходить через даты начала и окончания, которые затем я могу использовать для создания своего списка объектов WorkItemDTO. Основная проблема заключается в том, что сущность WorkItem может фактически порождать несколько объектов WorkItemDTO, поскольку WorkItem может быть установлен для повторения. Так, например, скажем, WorkItem повторяется один раз в неделю, и пользователь хочет видеть календарь на 1 месяц, этот единственный WorkItem будет порождать 4 отдельных конкретных объекта WorkItemDTO.

Затем, когда пользователь изменяет один из этих объектов WorkItemDTO на стороне клиента, я хочу, чтобы он был отправлен обратно как патч, который создает свою собственную сущность WorkItem.

Кто-нибудь знает, как я могу получить TableController для получения параметров? Или как заставить APIController работать так, чтобы синхронизация клиента не затрагивалась?

Любая помощь будет оценена.

Спасибо

Иаков

Автор: Jacob Joz Источник Размещён: 12.07.2016 04:05

Ответы (2)


3 плюса

3814 Репутация автора

Решение

На сервере вы можете легко добавить параметр запроса в контроллер get таблицы, добавив параметр с правильным именем и типом.

Например, вы можете добавить dateFilterпараметр запроса следующим образом:

public IQueryable<WorkItemDTO> GetAllWorkItem(string dateFilter)

Это будет вызвано передачей параметра запроса dateFilter = value. Вы можете использовать любой тип данных, который ASP.NET Web API поддерживает в сериализации. (Обратите внимание, что если у вас нет GetAll, который не принимает параметры запроса, вы получите метод Http 405 Not not, если вы выполняете Get без этого параметра запроса.)

На клиенте, как отмечает @JacobJoz, вы просто используете метод IMobileServiceTableQuery.WithParameters для построения запроса, который передается PullAsync. Если у вас есть несколько запросов инкрементной синхронизации к одной и той же таблице, и они используют разные значения для параметров, вы должны обязательно включить их в queryId для извлечения.

То есть, если у вас есть один запрос с параметрами foo = bar, а другой - foo = baz для одной и той же таблицы синхронизации, убедитесь, что вы используете два разных идентификатора запроса, один из которых содержит "bar", а другой - "baz". В противном случае 2 инкрементные синхронизации могут создавать помехи друг другу, поскольку queryId используется в качестве ключа для сохранения последней обновленной метки времени для этой таблицы синхронизации. Смотрите Как работает автономная синхронизация .

К сожалению, трудная часть передает параметр запроса как часть автономной синхронизации. Автономная синхронизация работает только с контроллерами таблиц.

Существует перегруженный метод расширения, PullAsyncкоторый принимает словарь параметров, но, к сожалению, он требует строкового запроса, а не IMobileServiceTableQuery:

PullAsync(this IMobileServiceSyncTable table, string queryId, string query, IDictionary<string, string> parameters, CancellationToken cancellationToken)

(Я подал ошибку, чтобы исправить это: добавить универсальную перегрузку PullAsync, которая принимает параметры запроса ).

Проблема заключается в том, что нет простого способа преобразования IMobileServiceTableQueryв строку запроса OData, поскольку вам необходимо получить доступ к внутренним методам SDK. (Я подал еще одну проблему: добавьте метод расширения ToODataString для IMobileServiceTableQuery .)

Автор: lindydonna Размещён: 14.07.2016 09:49

1 плюс

519 Репутация автора

Я просмотрел исходный код MobileServiceTableQuery на github. Похоже, он предоставляет метод с именем WithParameters. Я приковал вызов этого метода к CreateQuery, чтобы сгенерировать запрос к серверу, и он, кажется, делает то, что я хочу.

Вот код клиента:

var parameters = new Dictionary<string, string>();
parameters.Add("v1", "hello");

var query = WorkItemTable.CreateQuery().WithParameters(parameters);
await WorkItemTable.PullAsync("RetrieveWorkItems", query);

На сервере у меня есть реализация GetAll, которая выглядит следующим образом:

public IQueryable<WorkItem> GetAllWorkItem(string v1)
{
    //return IQueryable after processing business logic based on parameter
}

Параметризованная версия метода вызывается успешно. Я просто не совсем уверен, как это повлияет с точки зрения возрастающей тяги.

Автор: Jacob Joz Размещён: 21.07.2016 04:13
Вопросы из категории :
32x32