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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章