前言
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...