0

Я работаю над созданием нового веб-API, который реализует OData 4. Я хочу, чтобы иметь возможность выбирать/расширять свойства навигации, но я получаю сообщение об ошибке, t знать, как разрешить.C# OData4 WebApi не удается расширить свойство навигации

Я отправил запрос uri, ответную ошибку, образец кода и трассировку стека ниже. Если вы посмотрите на код, «Телефоны» - это скорее метод, а не как свойство Id и Name, но я бы подумал, что я должен иметь возможность выбирать и расширять результаты этого метода точно так же, как и свойства.

Что я могу сделать, чтобы пользователи API могли выбирать значения, возвращаемые этим методом?

P.S. Навигация свойство не может быть правильным названием (?)

URI Запроса

http://localhost:10013/Call?$select=*&$expand=Phones 

РЕАКЦИЯ

{ 
    "error" : { 
     "code" : "", 
     "message" : "The query specified in the URI is not valid. Could not find a property named 'Phones' on type 'Call'.", 
     "innererror" : { 
      "message" : "Could not find a property named 'Phones' on type 'Call'.", 
      "type" : "Microsoft.OData.ODataException" 
     } 
    } 
} 

Код

public class CallController : ODataController 
{ 
    [EnableQuery] 
    public IQueryable<Call> GetCall(ODataQueryOptions options) 
    { 
     return DatabaseContext.Call.GetAll(); 
    } 
} 

public class Call 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public IEnumerable<Phone> Phones() 
    { 
     //just an example 
     var list = new List<Phone>(); 
     return list as IEnumerable<Phone> 
    } 
} 

public class Phone 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

трассировку стека

  1. Microsoft.OData.UriParser.SelectExpandBinder.GenerateExpandItem (ExpandTermToken tokenIn)
  2. System.Linq.Enumerable.WhereSelectEnumerableIterator`2. MoveNext()
  3. System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
  4. System.Collections.Generic.List 1 коллекция)
  5. Microsoft.OData.UriParser.SelectExpandBinder.Bind (ExpandToken tokenIn)
  6. Microsoft.OData .UriParser.SelectExpandSemanticBinder.Bind (oDataPathInfo odataPathInfo, expandToken expandToken, SelectToken selectToken, конфигурация ODataUriParserConfiguration)
  7. Microsoft.OData.UriParser.ODataQueryOptionParser.ParseSelectAndExpandImplementation (String выберите, String расшириться, конфигурация ODataUriParserConfiguration, oDataPathInfo odataPathInfo) Microsoft.OData.UriParser .ODataQueryOptionParser.Pars eSelectAndExpand()
  8. System.Web.OData.Query.Validators.SelectExpandQueryValidator.Validate (SelectExpandQueryOption selectExpandQueryOption, ODataValidationSettings ValidationSettings)
  9. System.Web.OData.Query.SelectExpandQueryOption.Validate (ODataValidationSettings ValidationSettings)
  10. System.Web .OData.Query.Validators.ODataQueryValidator.Validate (опции ODataQueryOptions, ODataValidationSettings validationSettings)
  11. System.Web.OData.Query.ODataQueryOptions.Проверка (ODataValidationSettings ValidationSettings)
  12. System.Web.OData.EnableQueryAttribute.ValidateQuery (HttpRequestMessage запрос, ODataQueryOptions queryOptions)
  13. System.Web.OData.EnableQueryAttribute.ExecuteQuery (ответ объекта, HttpRequestMessage запрос, HttpActionDescriptor actionDescriptor, ODataQueryContext queryContext)
  14. System.Web.OData.EnableQueryAttribute.OnActionExecuted (HttpActionExecutedContext actionExecutedContext)

ответ

0

Вы, кажется, создали функцию под названием телефоны в классе Call. Пожалуйста, конвертировать эту функцию в собственность, как показано ниже:

общественных IEnumerable телефоны {получить, установить;}

+0

Я понимаю, что будет работать, это возможно сделать это без преобразования? – JacobVoller

+0

Как вам известно, разница в функции и свойства. OData может распознать свойство/атрибут модели, чтобы выставить ее как jone/xml/atom, но с функцией ее не будет. – aniket