我在 VS 2012 中创建了一个 WebApi 项目,使用 NHibernate 作为我的 ORM,我打算在它上面启用 Odata 支持。因此,我创建了一个带有单个 Get 方法的测试控制器,该方法从我的数据库中的表中返回实体列表。
一切正常,我可以使用 OData 过滤和排序我的结果等。问题是我找不到一种方法来限制从数据库返回到控制器的数据量,而这个表有数百万条记录在里面。
使用PageSize
属性的Queryable
属性似乎只限制了返回给客户端的数据量,但没有限制从数据库返回的数据量。
我尝试在返回之前在 get 方法内部应用 a Take(n)
,IQueryable
它限制了从数据库返回的结果,但它破坏了 OData 过滤,因为如果您尝试查询不在前 n 个结果中的实体,它只是返回一个空集合。
我知道您可以使用$Top
OData 上的参数来完成此操作,但我不想依赖提供它的客户/消费者,以确保我不会不必要地带来数千甚至数百万条我不会去的记录使用。
我还尝试手动检查客户端是否在查询字符串上提供了 Top 参数,将 OData 转换应用于我的 Queryable,然后将该Take(n)
方法应用于转换后的查询。这种方法使我能够通过 OData 过滤任何实体,但它会破坏分页,因为如果我使用该$Skip=n
参数,它会再次返回一个空集合。
那么,有什么方法可以在不破坏 OData 支持的情况下可靠地限制从数据库中获取的结果?