限制来自Web Api控制器和ODATA w / Nhibernate的服务器端结果

时间:2013-04-09 19:24:32

标签: asp.net-mvc linq nhibernate asp.net-web-api odata

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

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

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

我尝试在返回之前在get方法中的Take(n)上应用IQueryable,并且它限制了从DB返回的结果,但它打破了OData过滤,因为如果你尝试查询不在前n个结果中的实体,它只返回一个空集合。

我知道您可以使用OData上的$Top参数来实现这一目标,但我不想依赖于提供它的客户/消费者,以确保我不会不必要地带来数千甚至数百万我不打算使用的记录。

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

那么,有没有办法在不破坏OData支持的情况下可靠地限制从DB中获取的结果?

1 个答案:

答案 0 :(得分:2)

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

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