提前了解“只是因为提供能力并不是一个好主意”的警告......
从它的外观来看,OData compliant signatures require you return IQueryable。
例如:
[Queryable]
public IQueryable<MyModel> Get()
{
return _repo.GetAll().AsQueryable();
}
然而,最近和不近期的许多文章将IQueryable描述为:
我的问题:
您觉得IQueryable和OData的能力超重了上述问题吗?
在回答时,我希望人们谈论:
......那样的事情。
背景: 我不仅要问上面列出的项目。但也因为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; }
}
答案 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之上,具有各种有用的功能,如