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

and*_*chy 7 linq nhibernate asp.net-mvc odata asp.net-web-api

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

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

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

我试着应用Take(n)IQueryable返回之前里面的GET方法,它限制了结果从DB带回,但它打破了OData的过滤,因为如果你尝试查询,这不是在第n个结果的实体,它只返回一个空集合.

我知道你可以使用$TopOData上的参数来实现这一目标,但我不想依赖提供它的客户端/消费者,以确保我不会不必要地带来数千甚至数百万条我不会去的记录使用.

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

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

Rag*_*nti 2

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

是为其开放的问题。好消息是 Youssef 已经修复了它:)。这是修复它的提交。所以,如果你抓住了夜间构建,你应该会做得很好。