3

我在我的项目中设置了一个 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 在同一个查询中有TOPandJOIN语句,所以当一个审计有多个参数时,它会创建一份审计副本来保存第二个参数以返回它。这样做会占用查询允许的 TOP(30) 中的空间。然后,当它回到休眠状态时,它似乎合并了这些行,给我留下了一个记录比我想要的少的集合。

我的问题是:如何设置此调用,以便获得准确数量的记录,而无需单独获取参数并进行 n+1 查询?

4

1 回答 1

1

基本上你不容易,因为这就是 sql 的工作方式。省略 FetchMany,它应该使用 Select N+1 工作。为了解决这个问题,您可以调整集合批量大小,以便 NH 一次加载多个相同类型的集合。

于 2012-07-31T13:02:52.593 回答