Использование Entity Framework Я создал DbContext. Dbcontext создается в рамках проекта WebApi. Одна из таблиц из DbContext представляет собой здания. Местоположение представлено в виде географии в базе данных. Мне нужно запросить здания и отсортировать результат на расстоянии до заданного местоположения.WebApi Запрос OData с сложным типом игнорирует вложенные значения
типа, который используется для запроса
[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; }
}
Этот тип зарегистрирован ModelBuilder
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
// ... Registration of the types generated by EF
builder.EntitySet<t_building>("t_building");
builder.EntitySet<BuildingDistance>("BuildingDistances");
У меня есть следующие действия контроллера определяется
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);
}
запрос выполняется и результат отправляется клиенту. Проблема заключается в том, что свойство здания отсутствует
{ "odata.metadata":"http://localhost:50732/odata/$metadata#BuildingDistances","value":[
{
"Id":"15FF94FE-3CB8-4CF6-BE89-501A8366ED7C","Strasse":"Maistr.","Distance":4407.0418114105069
} ]
}
Только свойства ID, Расстояние и улицы фактически заполнены. Здание здания запрещено.
Если я запустил этот запрос в LinqPad, свойство Building заселяется.
Недвижимость не имеет права на чтение, поэтому корпус от here исключен.
Спасибо за любые предложения!
Update: попробовал подход, рекомендованный Fan Оуян, и я получаю следующую ошибку
типа «ObjectContent`1» Не удалось сериализовать тело ответа для контента типа «приложения/JSON; кодировка = UTF-8' .
Обновление: пробовал использовать подход навигационного свойства OData с использованием атрибута ForeignKey. Не повезло, с и без $ expand.
Благодарим вас за комментарий! Предложение не работает, я опубликовал сообщение об ошибке в обновлении до OP. – Nasser
обновил мой ответ –
Теперь я могу использовать расширение, а также выбрать. Я пошел со вторым решением ([EnableQuery] с актером). Спасибо, Fan Ouyang! – Nasser