2012-07-27 97 views
3

我有一个API在我的项目中设置了一个网格来调用以获取审计记录以显示给管理员。网格设置了无限滚动并使用mvc4内置的oData。所以,它将调用api,其中$ top等于它应该得到的行数,$ skip设置为正确的页面。NHibernate取回返回错误的行数

的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的有TOPJOIN声明在同一个查询中,所以当一个审计有多个参数时,它会创建一个审计副本以保存第二个参数以返回它。这样做占据了TOP(30)中查询允许的空间。然后,当它回到nhibernate时,看起来它合并了这些行,给我留下的记录少于我想要的集合。

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

回答

1

基本上,你不能轻松因为这是SQL如何工作。省略FetchMany,它应该使用选择N + 1。为了弥补这一点,你可以调整收集批量大小,以便NH一次加载多个相同类型的集合。