【问题标题】:Azure Mobile App Server doesn't return DBGeography on GETAzure 移动应用服务器在 GET 上不返回 DBGeography
【发布时间】:2021-03-05 00:23:12
【问题描述】:

我的 Microsoft Azure 移动应用服务器实例很乐意将 DBGeography POINT() 存储为表列,该列包含在确认已进行 POST 的 JSON 数据中。

我的“位置”数据对象:

public DbGeography Location { get; set; }

    [NotMapped]
    public double Longitude { get; set; }
    [NotMapped]
    public double Latitude { get; set; }

我的控制器:

public async Task<IHttpActionResult> PostI4Item([FromBody] IslandFourEntity item)
    {
        var coordinates = DbGeography.FromText($"POINT({item.Longitude} {item.Latitude})");
        item.Location = coordinates;
        
        IslandFourEntity current = await InsertAsync(item);
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }

“POST”请求后的邮递员响应:

{
"body": "Test body value",
"subject": "Test subject value",
"type": "type",
"location": {
    "geography": {
        "coordinateSystemId": 4326,
        "wellKnownText": "POINT (172.590401 -43.539994)"
    }
},
"longitude": 172.590401,
"latitude": -43.539994,
"id": "58542f5ee84d4867ae1f3d2c3b098b1b",
"version": "AAAAAAAAD6I=",
"createdAt": "2021-03-05T00:16:12.292Z",
"updatedAt": "2021-03-05T00:16:12.731Z",
"deleted": false

}

但是,如果您获取所有表值或仅一个单独的项目,则包含 DBGeography 项目的列不包含在其中(尽管肯定保存在数据库中。)

该记录的默认 GET 响应:

{
"deleted": false,
"updatedAt": "2021-03-05T00:16:12.731Z",
"createdAt": "2021-03-05T00:16:12.292Z",
"version": "AAAAAAAAD6I=",
"id": "58542f5ee84d4867ae1f3d2c3b098b1b",
"type": "type",
"subject": "Test subject value",
"body": "Test body value"

}

如您所见,除“位置”外,所有其他列均已返回。

所以这个问题可能更适合那些有过 Microsoft Azure 移动应用服务经验的人,但是如何修改默认的 Query() 方法以将 DBGeography 序列化为字符串?

【问题讨论】:

    标签: c# azure asp.net-web-api azure-mobile-services


    【解决方案1】:

    最终,你得到一个IQueryable&lt;T&gt;,然后它被 ASP.NET OData (v3) 系统或 Node.js 系统序列化(你没有说你使用的是哪个)。这里有两个问题 - IQueryable 返回什么,以及 oData 用它做什么。

    由于它是 OData v3 端点,请尝试添加 ?$expand=location 以查看是否会扩展输出。阅读the docs 中的 $expand 选项 - 第 5.1.3 节涵盖了 $expand。

    【讨论】:

    • 我很高兴尝试您的建议,但是当我添加 $expand=location 时,它只返回 '"location": {}' 我猜这表明存在一组数据,但是它返回的是空的。仍在寻找解决办法。
    • 您可能需要使用自定义 Newtonsoft.JSON 转换器来确保 Location 没有嵌套两层深。即"location": "POINT(x,y)" 而不是你在做什么。这样你也不需要做 $expand。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多