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 @   兴杰  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
历史上的今天:
2015-04-12 上传文件 file upload 学习笔记
点击右上角即可分享
微信分享提示