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...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
2015-04-12 上传文件 file upload 学习笔记