使用$ filter = geo.distance通过DbGeometry属性进行OData查询

Edu*_*rdo 5 geometry entity-framework odata asp.net-web-api

好的,我使用的是OData v4和WebApi 2.2,其中某些实体在坐标系统4674中设置了DbGeometry属性。假设我们有一个简单的实体,如下所示:

public class Aerodrome
{
    public short Id { get; set; }
    public string Name { get; set; }
    public System.Data.Entity.Spatial.DbGeometry Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和一个简单的ODataController如下:

public class AerodromeController : ODataController
{

    private SqlDbContext Db

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        Db = new SqlDbContext();
        base.Initialize(controllerContext);
    }

    [EnableQuery]
    public IQueryable<Aerodrome> Get()
    {
        return Db.Aerodrome;
    }

    protected override void Dispose(bool disposing)
    {
        Store.Dispose();
        base.Dispose(disposing);
    }
}
Run Code Online (Sandbox Code Playgroud)

}

WebApiConfig设置如下

public static void Register(HttpConfiguration config)
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Aerodrome>("Aerodrome");
    config.MapODataServiceRoute("odata", null, builder.GetEdmModel());
}
Run Code Online (Sandbox Code Playgroud)

现在,几乎所有内容都看起来不错。我可以使用OData查询,例如host / Aerodrome?$ filter = startswith(Name,'Flor')“)或host / Aerodrome?$ top = 20&$ skip = 60”,这样可以得到预期的结果集。

但是,我只能使过滤器与geo。*过滤器一起工作。

主机/机场?$ filter = geo.distance(位置,要点(-72.768952 -7.599057))lt 900.0

它返回错误,如下所示:

"error":{
"code":"","message":"The query specified in the URI is not valid. ')' or ',' expected at position 59 in 'geo.distance(Localizacao,geography, Point(-122.03547668457 47.6316604614258)) lt 900'.","innererror":{
  "message":"')' or ',' expected at position 59 in 'geo.distance(Localizacao,geography, Point(-122.03547668457 47.6316604614258)) lt 900'.","type":"Microsoft.OData.Core.ODataException","stacktrace":"   em Microsoft.OData.Core.UriParser.Parsers.FunctionCallParser.ParseArgumentList()\r\n
Run Code Online (Sandbox Code Playgroud)

有人可以启发我做错了吗?

小智 0

odata V4 中未实现地理功能。您可以自己添加支持,但这是一个有点复杂的解决方案,涉及更改 oData 代码本身。

该解决方案在此处进行了解释: 处理 OData 中的空间数据