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

时间:2008-12-15 08:08:45

标签: nhibernate

我有一个与Price类有一对多关系的Product Class。 所以产品可以有多种价格。

我需要查询数据库以获得10个具有Price.amount<港币$ 16。在这种情况下,它用于填充页面中包含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个)。 原因是SetMaxResults(10)返回10个产品,但有重复。然后通过SetResultTransformer(DistinctRootEntity)删除重复项。

有人能告诉我任何方式让我获得10个独特的产品而不增加SetMaxResults()吗?我需要使用pagenumber作为某种索引。

3 个答案:

答案 0 :(得分:0)

这取决于SQL决定,取决于获取列表的方法中发生的事情,您需要更改SQL以使其按您喜欢的方式运行。

但是要明确,你不应该得到任何重复。

答案 1 :(得分:0)

您的重复问题似乎源于您加入两张桌子的事实,因此您可以获得与您的价格相同的产品数量。

如何在产品表中添加2个额外的列:

MinimumPrice (numeric(18,2)
MaximumPrice (numeric(18,2)

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

SELECT TOP 10 * FROM Product
WHERE MinimumPrice > 2.0

你不会有重复的产品。

答案 2 :(得分:-1)

陈述的顺序会有所不同吗?它看起来像是在提前设置最大数量,并且在结束时清除重复数据,按照该顺序应用可能最终会少于您限制它的数量,与您描述的内容一致。

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