Проблема с использованием Where () для мобильной службы Azure - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий тест, который не работает:

public class DesktopDTO
{
    public DesktopDTO() {}
    public DesktopDTO(string title, Guid otherId) 
    {
         Id = Guid.NewGuid();
         Title = title;
         OtherId = otherId;
    }
    public Guid Id { get; set; }
    public string Title { get; set; }
    public Guid OtherId { get; set; }
}

//setup environment:
MobileServiceClient mobileService = new MobileServiceClient("http://myserver.azurewebsites.net/");
IMobileServiceSyncTable<DesktopDTO> table = mobileService.GetSyncTable<DesktopDTO>();
if (!mobileService.SyncContext.IsInitialized)
{
    var store = new MobileServiceSQLiteStore("localstore1.db");
    store.DefineTable<DesktopDTO>();
    await mobileService.SyncContext.InitializeAsync(store);
}
DesktopDTO input = new DesktopDTO("test124", Guid.NewGuid()); //this is my entity

//invoke action:
await table.InsertAsync(input);

//check results:
List<DesktopDTO> all = await table.ToListAsync();  //this returns 1 item
DesktopDTO r1 = all.Where(x => x.Id == input.Id).FirstOrDefault();  //this returns the created item
var query12 = await table.Where(x => x.Title == "test124").ToCollectionAsync(); //this returns 1 item
DesktopDTO r = (await table.Where(x => x.Id == input.Id).ToCollectionAsync()).FirstOrDefault(); //this returns null!!

Проблема в том, что последний локальный запрос, который использует предложение Where(), отфильтрованное по Id (который является PK объекта DesktopDTO), не возвращает требуемый объект.

Объект был правильно вставлен в БД (как показывают другие запросы, даже тот, который отфильтрован по «Заголовку»), поэтому я не понимаю, почему фильтр Where() не должен работать только с PK.

Я также пытался использовать метод LookupAsync(), но опять не получил результатов.

Что я делаю не так?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Для дальнейшего использования я обнаружил проблему.

Служба мобильной связи Azure не позволяет иметь (изначально) поля, такие как GUID.Но он принимает направляющие и тихо преобразует их в строки, используя UPPER CASE.

Поэтому решение состоит в том, чтобы превратить все направляющие в UPPER CASE в запросах.

Вы можете сделать либо:

DesktopDTO r = (await table.Where(x => x.Id.ToString.ToUpper() == input.Id.ToString.ToUpper()).ToCollectionAsync()).FirstOrDefault();

или напрямую:

DesktopDTO r = await table.LookupAsync(id.ToString().ToUpper());
0 голосов
/ 15 ноября 2018

Я пытаюсь воспроизвести проблему на моей стороне.Но я получил ArgumentException: «Идентификатор должен иметь тип string».

enter image description here

Если я изменю тип идентификатора с Guid to string , я не могу воспроизвести проблему, о которой вы упоминали.Я правильно работаю на своей стороне.

public class DesktopDTO
    {
        public DesktopDTO() { }
        public DesktopDTO(string title, Guid otherId)
        {
            Id = Guid.NewGuid().ToString();
            Title = title;
            OtherId = otherId;
        }
        public string Id { get; set; }
        public string Title { get; set; }
        public Guid OtherId { get; set; }

    }

Результат теста:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...