我在我的项目中设置了一个 API,用于调用网格以获取审核记录以显示给管理员。网格具有无限滚动设置并使用 mvc4 内置的 oData。因此,它将调用 api,其中 $top 等于它应该获取的行数,并且 $skip 设置为到达正确的页面。
在 API 内部,我调用 nhibernate 来获取 IQueryable 以返回 MVC4 来执行它的黑暗 oData 魔法:
m_session.Query<AuditInfo>().FetchMany(x => x.Parameters).Fetch(x => x.AuditType).Fetch(x => x.Status)
在此,AuditInfo 有一组参数,以及类型和状态的查找表。
我的问题是,如果我要求 30 行,它将返回一些数字 <= 30。我已经能够稍微追踪一下,问题似乎是 nhibernate 在同一个查询中有TOP
andJOIN
语句,所以当一个审计有多个参数时,它会创建一份审计副本来保存第二个参数以返回它。这样做会占用查询允许的 TOP(30) 中的空间。然后,当它回到休眠状态时,它似乎合并了这些行,给我留下了一个记录比我想要的少的集合。
我的问题是:如何设置此调用,以便获得准确数量的记录,而无需单独获取参数并进行 n+1 查询?