首页 > 解决方案 > Azure 移动应用服务器在 GET 上不返回 DBGeography

问题描述

我的 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#azureasp.net-web-apiazure-mobile-services

解决方案


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

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


推荐阅读