7

我在 VS 2012 中创建了一个 WebApi 项目,使用 NHibernate 作为我的 ORM,我打算在它上面启用 Odata 支持。因此,我创建了一个带有单个 Get 方法的测试控制器,该方法从我的数据库中的表中返回实体列表。

一切正常,我可以使用 OData 过滤和排序我的结果等。问题是我找不到一种方法来限制从数据库返回到控制器的数据量,而这个表有数百万条记录在里面。

使用PageSize属性的Queryable属性似乎只限制了返回给客户端的数据量,但没有限制从数据库返回的数据量。

我尝试在返回之前在 get 方法内部应用 a Take(n)IQueryable它限制了从数据库返回的结果,但它破坏了 OData 过滤,因为如果您尝试查询不在前 n 个结果中的实体,它只是返回一个空集合。

我知道您可以使用$TopOData 上的参数来完成此操作,但我不想依赖提供它的客户/消费者,以确保我不会不必要地带来数千甚至数百万条我不会去的记录使用。

我还尝试手动检查客户端是否在查询字符串上提供了 Top 参数,将 OData 转换应用于我的 Queryable,然后将该Take(n)方法应用于转换后的查询。这种方法使我能够通过 OData 过滤任何实体,但它会破坏分页,因为如果我使用该$Skip=n参数,它会再次返回一个空集合。

那么,有什么方法可以在不破坏 OData 支持的情况下可靠地限制从数据库中获取的结果?

4

1 回答 1

2

我们最近也发现了这一点。当启用服务器驱动的分页时,我们不会应用 Take(pageSize),因为我们必须确定是否应该生成下一页链接。我们只是枚举 pageSize 个实体的结果集并检查是否有更多实体。我们认为大多数提供者通常会带来部分结果集,因为 IQueryable 通常是一种惰性实现。事实证明这不是真的。此外,如果数据库知道只需要 pageSize 个结果,它可以优化查询。

是为它打开的问题。好消息是优素福已经修好了:)。这是修复它的提交。所以,如果你抓住每晚的构建,你应该是好的。

于 2013-04-10T05:09:43.207 回答