问题描述
我的 Microsoft Azure 移动应用服务器实例很乐意将 DBGeography POINT() 存储为表列,该列包含在 JSON 数据中,确认已进行 POST。
我的“位置”数据对象:
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,"body": "Test body value"
}
如您所见,除“位置”外,其他所有列都被返回。
所以这个问题对于任何使用过 Microsoft Azure 移动应用服务的人来说可能更多,但是如何修改默认的 Query() 方法以将 DBGeography 序列化为字符串?
解决方法
最终,你得到一个 IQueryable<T>
,然后它被 ASP.NET OData (v3) 系统或 Node.js 系统序列化(你不说你在使用哪个)。这里有两个问题 - IQueryable 返回什么,以及 oData 用它做什么。
由于它是 OData v3 端点,请尝试添加 ?$expand=location
以查看是否会扩展输出。阅读 the docs 中的 $expand 选项 - 第 5.1.3 节介绍了 $expand。