2014-09-26 63 views
4

好吧,我正在使用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; } 
} 

和簡單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); 
    } 
} 

}

而且WebApiConfig這樣設置

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

現在,幾乎所有的東西都看起來不錯。我可以使用OData查詢,如主機/機場?$ filter = startswith(Name,'Flor')「)或host/Aerodrome?$ top = 20 & $ skip = 60」我得到了預期的結果集。

但是,我只是可以使過濾器工作sith geo。*過濾器。 ?

主機/機場$過濾= 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 

有人可以啓發我」米做錯了嗎?

+0

它看起來像是抱怨在點的值之間的空間,或許它需要一個逗號或其他什麼東西? – DavidG 2014-09-26 12:19:45

回答

0

地理功能未在odata V4中實施。您可以自己添加支持,但這是一個涉及更改oData代碼本身的複雜解決方案。

該解決方案在這裏解釋Dealing with spatial data in OData

+0

以及V3 for web api項目。 – Gutek 2017-02-08 14:03:45