Nhibernate 如何设置多对一的最大返回结果

Nhibernate 如何设置多对一的最大返回结果,nhibernate,Nhibernate,我有一个与价格类有一对多关系的产品类。 因此,一种产品可以有多种价格 我需要查询数据库,以获得10个产品的价格。金额

我有一个与价格类有一对多关系的产品类。 因此,一种产品可以有多种价格

我需要查询数据库,以获得10个产品的价格。金额<2美元。在这种情况下,在一个页面中用10个项目填充UI是非常困难的。 所以我写了以下代码:

ICriteria criteria = session.CreateCriteria(typeof(Product));

criteria.SetFirstResult(pageNumber);
criteria.SetMaxResults(numberOfItemInPage);

criteria = criteria.CreateCriteria("PriceCollection");
criteria.Add(Restrictions.Le("Amount", new Decimal(2)));
criteria.SetResultTransformer(CriteriaSpecification.DistinctRootEntity);
清单上的产品不是10个,而是5个。 设置的原因MaxResults10返回10个产品,但有重复项。然后,通过SetResultTransformerDintintRootentity删除重复项


有谁能告诉我有什么方法可以让我在不增加SetMaxResults的情况下获得10种独特的产品?我需要使用pagenumber作为某种索引。

这将由SQL来决定,具体取决于获取列表的方法中发生了什么,您需要更改SQL以使其按您喜欢的方式运行


但是,由于不同,您不应该得到任何重复的语句。

语句的顺序会有所不同吗?它看起来像是在早期设置最大计数,并在最后剔除重复项,按此顺序应用的重复项可能会少于您限制的数量,这与您描述的情况一致


我认为您需要有效地获得所有结果,然后应用限制,可能还有排序?并清除重复项,然后最后对那些重复项应用分页或计数限制,以获得前10个、下10个,依此类推。因此,重新排列语句以反映这种逻辑顺序可能有助于修复您的错误。

看来您的重复问题源于这样一个事实,即您正在连接两个表,因此您可以获得相同的产品,只要您有价格就可以

向产品表中添加两个额外的列如何:

MinimumPrice (numeric(18,2)
MaximumPrice (numeric(18,2)
每当您的系统修改产品的定价时,您都会更新产品上的这两个字段。现在,您可以编写如下所示的SQL查询:

SELECT TOP 10 * FROM Product
WHERE MinimumPrice > 2.0

而且您不会有重复的产品。

这将是一个解决方案,但如果是一个大表,比如说一百万行,它会对性能产生一定的影响。无论您是在开始还是结束时应用SetMaxResults都无关紧要。执行时,它仍将转换为相同的SQL查询。