gpt4 book ai didi

asp.net-web-api - 使用 ODataQueryOptions 扩展导航属性

转载 作者:行者123 更新时间:2023-12-02 17:35:13 28 4
gpt4 key购买 nike

我正在构建一个 OData v.4 Web 服务,该服务必须公开从另一个第 3 方 Web 源检索的数据,因此数据与 LINQ 世界中的任何内容都不相似,即:没有 IQueryable,没有上下文,没有任何......

要走的路似乎是手动处理来自 ODataQueryOptions 的参数并返回简单的项目序列。因此, Controller 方法应如下所示:

class MyMasterEntity {
[Contained]
public IEnumerable<MyDetailEntity> Details { get; set; }
}

// [EnableQuery]
public IEnumerable<MyMasterEntity> Get(ODataQueryOptions<MyMasterEntity> options)
{
// process .FilterQueryOption
// process .SelectExpandQueryOption
// process .SkipQueryOption
// process .TopQueryOption
return myMasterEntityList;
}

$expand=Details 外,此方法运行良好,在这种情况下,属性不会在结果响应中扩展,尽管我的逻辑添加它们很好。

如果添加 [EnableQuery] 属性(开始时没有任何意义,因为它与 ODataQueryOptions 的整个想法互斥),然后扩展开始工作。或者它假装正在工作,因为真正发生的是查询被处理了两次:第一次由我的代码处理,然后在我返回数据后由 OData 机器处理。这可能是可以容忍的(无论如何,我手动执行昂贵的调用,所以没有什么大的 OData 重试已经准备好的数据),如果不是因为第二遍搞砸了像 $skip 这样的非确定性操作。 (即:您可以根据需要多次应用 $top 来获得相同的结果,但使用 $skip 则不行)。

正如我从逆向工程相关程序集了解到的那样,标准扩展代码将实体包装成某种东西,它告诉 JSON 格式化程序发出相应的属性,而不管它们是否实际上在实体内部扩展。

还试过:

  • 更改返回类型(IQueryable、IHttpActionResult)
  • 强制调用 SelectExpandQueryOption.ApplyTo(myMasterEntityList, new ODataQuerySettings()) 在手动扩展之后,但在返回之前

如何正确扩展导航属性?

最佳答案

为什么要手动处理查询选项?

使用 AsQueryable将数据转换为可查询集合的 LINQ 扩展方法(实际上您正在使用 LINQ to Object)。

  • 您的 Controller 必须继承自 ODataController
  • IEdmModel必须与路线相关联。使用 ODataModelBuilder(或 ODataConventionModelBuilder)定义它。
  • 您的方法必须返回 IQueryable<MyMasterEntity>
  • 只声明 [EnableQuery] .不要显式声明 ODataQueryOptions争论

关于asp.net-web-api - 使用 ODataQueryOptions 扩展导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27535409/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com