2016-07-13 3 views
0

Использование 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.

ответ

0

Вы должны

$expand=Building 

В запросе, чтобы иметь свойство навигации в полезной нагрузке.

Когда есть $ развернуть или $ выбрать в запросе, тип результата метода applyto будет класс обертки в WebAPI/OData, так что вы должны удалить as IQueryable<BuildingDistance> и использовать код как https://github.com/OData/WebApi/blob/master/OData/test/E2ETest/WebStack.QA.Test.OData/DollarLevels/DollarLevelsController.cs#L62-L63

или вы может просто использовать атрибут EnableQuery в методе контроллера и просто вернуть запрос:

[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

Благодарим вас за комментарий! Предложение не работает, я опубликовал сообщение об ошибке в обновлении до OP. – Nasser

+0

обновил мой ответ –

+0

Теперь я могу использовать расширение, а также выбрать. Я пошел со вторым решением ([EnableQuery] с актером). Спасибо, Fan Ouyang! – Nasser

Смежные вопросы