将Where()用于Azure移动服务时遇到问题

时间:2018-11-13 02:37:19

标签: c# sqlite azure azure-mobile-services

我的以下测试无效:

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!!

问题在于,最后一个本地查询(它使用由ID过滤的Where()子句(DesktopDTO实体的PK)不会返回所需的实体。

该实体已正确插入数据库中(如其他查询所示,即使是由“标题”过滤的查询),所以我不明白为什么Where()过滤器不只适用于PK

我也尝试使用LookupAsync()方法,但仍然没有结果。

我在做什么错了?

谢谢!

2 个答案:

答案 0 :(得分:0)

我尝试重现此问题。但是我得到了ArgumentException:“该ID必须是字符串类型”。

enter image description here

如果我将ID类型从 Guid 更改为 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

答案 1 :(得分:0)

我发现了问题,以供将来参考。

Azure移动服务不允许(本机)具有GUID之类的字段。但是它接受Guid并使用大写字母将它们默默地转换为字符串。

因此,解决方案是在查询中将所有Guid变成大写。

您可以执行以下任一操作:

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

或直接:

DesktopDTO r = await table.LookupAsync(id.ToString().ToUpper());