【问题标题】:How to set max return result for many-to-one如何为多对一设置最大返回结果
【发布时间】:2013-10-24 00:27:30
【问题描述】:

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

我需要查询 db 以获得 10 个 Price.amount

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) 删除重复项。

谁能告诉我在不增加 SetMaxResults() 的情况下获得 10 个独特产品的方法吗?我需要使用 pagenumber 作为某种索引。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

    但由于 Distinct,您不应该得到任何重复。

    【讨论】:

      【解决方案2】:

      您的重复问题似乎源于您要连接两个表的事实,因此您可以获得相同产品的次数与价格相同。

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

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

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

      SELECT TOP 10 * FROM Product
      WHERE MinimumPrice > 2.0
      

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

      【讨论】:

        【解决方案3】:

        语句的顺序会有所不同吗?看起来它提前设置了最大计数,并在最后清除了重复项,按照该顺序应用可能最终会少于您限制的数量,这与您描述的情况一致。

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

        【讨论】:

        • 这将是一种解决方案,但在一个大表的情况下,比如 100 万行,它会在一定程度上影响性能。
        • 无论是在开头还是结尾应用 SetMaxResults 都没有关系。它在执行时仍会转换为相同的 SQL 查询。
        猜你喜欢
        • 2020-06-05
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多