【发布时间】:2013-03-01 16:43:38
【问题描述】:
提前了解“仅仅因为提供了一项功能并不意味着它是一个好主意”的警告......
从外观上看,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(但最终也可能有用)。
结果示例:
至少,我们的返回签名会发生巨大变化。而且,我被告知通过将“C Instance”更改为“IQueryable Instance”(这是有道理的)来实现 OData 的 WebAPI 调用不会起作用。
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 明白了。很棒的评论。但是,IQueryable 是延迟执行(现在基本上)是 URL 可配置查询...对吗?
-
是的,但是 API 编码人员有责任限制、检查权限、施加最大 Take 等...仅仅因为您可以做任何事情,并不意味着您应该做任何事情。
标签: c# asp.net asp.net-web-api odata