2013-03-13 87 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
相关问题