OData – 坑

前言

OData 有很多很多的坑,我的主张是能少用一样是一样,比如 Batch Processing 不要用,Inheritance 不要用,除了 GET 其它 PUT POST DELETE 都不要用,$apply 不要用,等等等。

这篇记入一些,我避开了绝大部分功能后依然掉的坑。

 

当 $apply 遇上 Ok

参考:Github – $apply is not showing meta data info when I use IActionResult

版本:ASP.NET Core 8.0.4,OData 8.2.5

我几年前就知道 $apply 这种复杂的功能一定有很多坑的,也早就停用了。

只是今天机缘巧合下去尝试了一遍,结果不出所料,掉坑...

下面是一个很简单的 Controller

[ApiController]
[Route("api")]
public class PersonController(
  ApplicationDbContext db
) : ControllerBase
{
  [ODataAttributeRouting]
  [EnableQuery]
  [HttpGet("people")]
  [Produces(MediaTypeNames.Application.Json)]
  [ProducesResponseType(StatusCodes.Status200OK)]
  public ActionResult<IQueryable<Person>> GetPeople()
  {
    return Ok(db.People);
  }
}

发现哪里有问题了吗?

public ActionResult<IQueryable<Person>> GetPeople()
{
  return Ok(db.People);
}

发现了吗?

return Ok(db.People);

还没发现?!

是的,正常人是看不出来哪里有问题的,因为整个写法和官方网站的 Demo 一摸一样。

我们尝试 query 看看

哎哟,一切正常哦。

加入 $apply 再试试

http://localhost:5237/api/people?$apply=groupby((name),aggregate($count as count))&$count=true

效果

它直接返回 array,而不是一个 odata 对象,少了 @odata.context 和 @odata.count。

接着,我们修改一行代码

public ActionResult<IQueryable<Person>> GetPeople()
{
  // return Ok(db.People);
  return db.People;
}

去掉 Ok(),直接返回 IQueryable 就好。

见证奇迹的时刻...

一切正常。

神奇吗?惊讶吗?我就问你,这是不是坑?!

照着官网做,一些功能正常运作,一些功能有一半没一半...恐怖吗?

结论:珍惜生命,远离 OData...

 

posted @ 2024-04-12 17:25  兴杰  阅读(67)  评论(0)    收藏  举报