2016-07-13 10 views
0

Mit Entity Framework habe ich einen DbContext erstellt. Der Dbcontext wird in einem WebApi-Projekt erstellt. Eine der Tabellen aus dem DbContext repräsentiert Gebäude. Der Ort wird in der Datenbank als Geographietyp dargestellt. Ich muss die Gebäude abfragen und das Ergebnis nach der Entfernung zu einem bestimmten Ort sortieren.WebApi-OData-Abfrage mit komplexem Typ ignoriert verschachtelte Werte

Der Typ für die Abfrage verwendet wird, ist

[DataContract] 
public class BuildingDistance 
{ 
    [Key] 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public string Street { get; set; } 
    [DataMember] 
    public double? Distance { get; set; } 
    [DataMember] 
    public t_building Building { get; set; } 
} 

Diese Art mit Modellbauer

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
// ... Registration of the types generated by EF 
builder.EntitySet<t_building>("t_building"); 
builder.EntitySet<BuildingDistance>("BuildingDistances"); 

Aktion habe ich die folgenden Controller

 public IHttpActionResult GetBuildingDistances(ODataQueryOptions<BuildingDistance> queryOptions) 
    { 
     // validate the query. 
     try 
     { 
      queryOptions.Validate(_validationSettings); 
     } 
     catch (ODataException ex) 
     { 
      return BadRequest(ex.Message); 
     } 

     dbcontext db = new dataBaseEntities(); 
     string pointString = string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", 11.53128, 48.17883); 
     DbGeography myLocation = DbGeography.FromText(pointString, 4326); 
     var query = 
      db.t_building.Select(
       x => 
        new BuildingDistance 
        { 
         Id = x.id, 
         Street = x.location_street, 
         Building = x, 
         Distance = x.GeoLocation.Distance(myLocation) 
        }); 

     var result = queryOptions.ApplyTo(query) as IQueryable<BuildingDistance>; 

     return Ok(result); 
    } 

Die Abfrage ausgeführt wird definiert registriert ist, und Ein Ergebnis wird an den Client gesendet. Das Problem ist, dass das Eigentum Gebäude fehlt

{ "odata.metadata":"http://localhost:50732/odata/$metadata#BuildingDistances","value":[ 
{ 
    "Id":"15FF94FE-3CB8-4CF6-BE89-501A8366ED7C","Strasse":"Maistr.","Distance":4407.0418114105069 
} ] 

}

Nur die Eigenschaften ID, Abstand und Straße sind tatsächlich besiedelt. Die Eigenschaft Gebäude ist weggelassen.

Wenn ich diese Abfrage in LinqPad ausführen, wird die Eigenschaft Gebäude ausgefüllt.

Eigenschaft ist nicht readonly, so dass der Fall von here ausgeschlossen ist.

Vielen Dank für Anregungen!

Update: versucht, den Ansatz von Fan Ouyang empfohlen und ich erhalte die folgenden Fehler

Der ‚ObjectContent`1‘ Typ konnte den Antworttext für Inhaltstyp ‚application/json serialisiert; charset = utf-8 '.

Update: versucht, die Navigationseigenschaft Ansatz von OData mit Attribute ForeignKey verwenden. Kein Glück, mit und ohne $ expand.

Antwort

0

Sie sollten In der Abfrage

$expand=Building 

müssen Navigationseigenschaft in der Nutzlast haben.

Wenn es eine in der Abfrage $ erweitern oder wählen Sie $, wird der Ergebnistyp der AnwendenAuf Methode Wrapper-Klasse sein, in WebAPI/OData, so dass Sie den as IQueryable<BuildingDistance> und Code verwenden, entfernen sollte wie https://github.com/OData/WebApi/blob/master/OData/test/E2ETest/WebStack.QA.Test.OData/DollarLevels/DollarLevelsController.cs#L62-L63

oder Sie kann nur EnableQuery Attribut in der Controller-Methode verwenden und nur die Abfrage zurückgeben:

[EnableQuery] 
public IHttpActionResult GetBuildingDistances() 
{ 
    ... 
    var query = 
     db.t_building.Select(
      x => 
       new BuildingDistance 
       { 
        Id = x.id, 
        Street = x.location_street, 
        Building = x, 
        Distance = x.GeoLocation.Distance(myLocation) 
       }); 
    return Ok(query as IQueryable<BuildingDistance); 
} 
+0

Vielen Dank für den Kommentar! Vorschlag funktioniert nicht, ich habe eine Fehlermeldung in Update zu OP geschrieben. – Nasser

+0

aktualisiert meine Antwort –

+0

Jetzt kann ich sowohl erweitern als auch wählen. Ich ging mit der zweiten Lösung ([EnableQuery] mit einer Besetzung). Danke Fan Ouyang! – Nasser

Verwandte Themen