2013-03-13 102 views
8

提前瞭解「僅僅因爲提供了一項功能並不能使其成爲一個好主意」的警告「...使用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; } 
} 
+0

您的示例不現實。你不應該做一個GetAll()。AsQueryable()! – Hylaean 2013-03-13 17:31:24

+0

@Hylaean瞭解。很棒的評論。但是,IQueryable延遲執行什麼(現在基本上)是一個可配置URL的查詢......對吧? – 2013-03-13 17:33:24

+0

是的,但它仍然是API編碼員的責任,限制,檢查權限,強加一個最大等等......只因爲你可以做任何事情,並不意味着你應該這樣做。 – Hylaean 2013-03-13 17:36:10

回答

3

支持使用Web API查詢OData並不要求你有一個IQueryable<T>。有一個IQueryable<T>可以讓你更快,更少的代碼。 IQueryable<T>具有將傳入的OData查詢轉換爲LINQ查詢所需的抽象。該框架已經定義了它,並且對Entityframework,NHibernate,Linq2Objects,RavenDB,Linq2OData等各種後端都有豐富的支持。因此,我們決定使用web API對IQueryable<T>提供豐富的支持。同意,IQueryable<T>是一個巨大的界面,並且比OData查詢所需的更多。但這是免費的:)。

這就是說,我們通過ODataQueryOptions<T>對非IQueryable的情況有很好的支持。看看我的博客文章here

此外,你是OData查詢語義與OData混淆。豐富的查詢支持只是OData的一部分。 OData建立在HTTP之上,並具有各種有用的功能,如

  • REST和HTTP最佳實踐的深思熟慮的應用程序。
  • Unambiguos在json和xml中表示您的資源。
  • $ metadata。
  • 描述關係的標準方式。
  • 豐富的查詢支持投影,過濾,客戶端驅動的分頁和服務器驅動的分頁(下一頁鏈接)。
  • ecosystem
相關問題