【问题标题】:C# OData4 WebApi fails on expand of navigation propertyC# OData v4 Web Api 在扩展导航属性时失败
【发布时间】:2017-05-25 15:36:04
【问题描述】:

我正在创建一个实现 OData 4 的新 Web API。我希望能够选择/扩展导航属性,但我遇到了一个我不知道如何解决的错误。

我在下面发布了请求 uri、响应错误、示例代码和堆栈跟踪。如果您查看代码,“电话”显然是一种方法,而不是像 Id 和 Name 这样的属性,但我认为我应该能够像属性一样选择和扩展该方法的结果。

我可以做些什么来允许 API 的用户选择从该方法返回的值?

附注导航属性可能不是正确的名称(?)

请求 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.List1.InsertRange(Int32 index, IEnumerable1 集合)
  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(字符串选择、字符串展开、ODataUriParserConfiguration 配置、ODataPathInfo odataPathInfo) Microsoft.OData.UriParser.ODataQueryOptionParser.ParseSelectAndExpand()
  8. System.Web.OData.Query.Validators.SelectExpandQueryValidator.Validate(SelectExpandQueryOption selectExpandQueryOption, ODataValidationSettings 验证设置)
  9. System.Web.OData.Query.SelectExpandQueryOption.Validate(ODataValidationSettings 验证设置)
  10. System.Web.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions 选项,ODataValidationSettings 验证设置)
  11. System.Web.OData.Query.ODataQueryOptions.Validate(ODataValidationSettings 验证设置)
  12. System.Web.OData.EnableQueryAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)
  13. System.Web.OData.EnableQueryAttribute.ExecuteQuery(对象响应、HttpRequestMessage 请求、HttpActionDescriptor actionDescriptor、ODataQueryContext queryContext)
  14. System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 odata navigation-properties


    【解决方案1】:

    您似乎在 Call 类中创建了名为 Phones 的函数。请将该函数转换为如下属性:

    公共 IEnumerable 电话 {get;set;}

    【讨论】:

    • 我知道这行得通,是否可以在不转换的情况下做到这一点?
    • 您可能知道,函数和属性是有区别的。 OData 可以识别模型的属性/属性以在 json/xml/atom 中作为响应公开,但使用函数则不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2013-12-25
    • 1970-01-01
    • 2018-08-30
    • 2012-05-20
    • 2016-02-27
    相关资源
    最近更新 更多