我在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中获取的结果?