使用OData是一个好主意吗?

时间:2013-03-13 16:10:00

标签: c# asp.net asp.net-web-api odata

提前了解“只是因为提供能力并不是一个好主意”的警告......

从它的外观来看,OData compliant signatures require you return IQueryable

例如:

[Queryable]
public IQueryable<MyModel> Get()
{
    return _repo.GetAll().AsQueryable();
}

然而,最近和不近期的许多文章将IQueryable描述为:

我的问题
您觉得IQueryable和OData的能力超重了上述问题吗?

在回答时,我希望人们谈论:

  • 为什么或为什么不呢?
  • 我什么时候应该使用它?
  • 您是仅在某些WebAPI调用中使用...还是用于所有WebAPI调用?
  • 那些不是IEnumarable对象的个别模型怎么样?

......那样的事情。

背景: 我不仅要问上面列出的项目。但也因为OData作为“行业标准”出售给我们,而不是工具箱中的工具。因此,实现这一点将从根本上改变我们的WebAPI调用(我目前工作的地方)的回报。我们必须从我们自己的IResult返回签名(这非常有用)转到IQueryable,这似乎有问题(但也可能最终有用)。

IRESULT示例:
至少,我们的返回签名会发生巨大变化。并且,我被告知WebAPI调用实现OData不会通过将“C Instance”更改为“IQueryable Instance”(这是有道理的)。

public interface IResult<C>
{
    [JsonProperty(PropertyName = "hasErrors")]
    bool HasErrors { get; }

    [JsonProperty(PropertyName = "errors")]
    IList<String> Errors { get; }

    [JsonProperty(PropertyName = "instance")]
    C Instance { get; set; }
}

1 个答案:

答案 0 :(得分: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最佳实践应用。
  • json和xml中资源的Unambiguos表示。
  • $元数据。
  • 描述关系的标准方式。
  • Rich查询支持投影,过滤,客户端驱动的分页和服务器驱动的分页(下一页链接)。
  • ecosystem