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.
Vielen Dank für den Kommentar! Vorschlag funktioniert nicht, ich habe eine Fehlermeldung in Update zu OP geschrieben. – Nasser
aktualisiert meine Antwort –
Jetzt kann ich sowohl erweitern als auch wählen. Ich ging mit der zweiten Lösung ([EnableQuery] mit einer Besetzung). Danke Fan Ouyang! – Nasser