提前瞭解「僅僅因爲提供了一項功能並不能使其成爲一個好主意」的警告「...使用OData是個好主意嗎?
從外觀上看,OData compliant signatures require you return IQueryable。
例如:
[Queryable]
public IQueryable<MyModel> Get()
{
return _repo.GetAll().AsQueryable();
}
然而,在最近的和不那麼最近許多文章描述的IQueryable爲:
- Leaky
- 'Causing Heavy Lifting' 例如:允許用戶抓取整個桌子
- 安全&結垢問題,因爲它查詢本身
- 還可引起從延遲執行的問題(因爲它的可查詢的本質)
我的問題是的allows for heavy modification:
你覺得能力IQueryable和OData超出上述問題?
回答,我希望人們談論:
- 爲什麼或者爲什麼不呢?
- 我應該什麼時候使用它?
- 您是否僅在某些WebAPI調用中使用...或者用於所有WebAPI調用?
- 那些不是IEnumarable對象的單個模型呢?
...這樣的事情。
背景: 我問,不僅是因爲上面列出的項目。但也因爲OData作爲「行業標準」而不是工具箱中的工具出售給我們。因此,實現這一點將從根本上改變我們的WebAPI調用(我目前工作的地方)的回報。我們必須從我們自己的IResult返回簽名(這非常有用)到IQueryable,這似乎有問題(但也可能最終有用)。
IRESULT示例:
至少,我們的退貨簽名會發生劇烈變化。並且,通過將「C實例」更改爲「IQueryable實例」(這是有道理的),我被告知WebAPI調用實現OData無法工作。
public interface IResult<C>
{
[JsonProperty(PropertyName = "hasErrors")]
bool HasErrors { get; }
[JsonProperty(PropertyName = "errors")]
IList<String> Errors { get; }
[JsonProperty(PropertyName = "instance")]
C Instance { get; set; }
}
您的示例不現實。你不應該做一個GetAll()。AsQueryable()! – Hylaean 2013-03-13 17:31:24
@Hylaean瞭解。很棒的評論。但是,IQueryable延遲執行什麼(現在基本上)是一個可配置URL的查詢......對吧? – 2013-03-13 17:33:24
是的,但它仍然是API編碼員的責任,限制,檢查權限,強加一個最大等等......只因爲你可以做任何事情,並不意味着你應該這樣做。 – Hylaean 2013-03-13 17:36:10