nHibernate条件查询使用分页生成重复项

nHibernate条件查询使用分页生成重复项,nhibernate,Nhibernate,nHibernate 2.1版 从大量类似的问题中可以看出,我们并不是唯一遇到分页生成重复项问题的人。我们认为这只是HQL查询的结果,但我们的一个客户报告说,在查询是条件查询的地方看到了它 到目前为止,我们只在报告方面看到了它——我们倾向于从各种“关联”实体收集信息,并使用AliasToBeanTransformer将其放入DTO(DataTransferObject)中: .SetResultTransformer(新别名为BeanResultTransformer(类型为(OurDTO)))

nHibernate 2.1版

从大量类似的问题中可以看出,我们并不是唯一遇到分页生成重复项问题的人。我们认为这只是HQL查询的结果,但我们的一个客户报告说,在查询是条件查询的地方看到了它

到目前为止,我们只在报告方面看到了它——我们倾向于从各种“关联”实体收集信息,并使用AliasToBeanTransformer将其放入DTO(DataTransferObject)中:

.SetResultTransformer(新别名为BeanResultTransformer(类型为(OurDTO)))

我们对nHibernate并不陌生,但我们肯定没有意识到它的许多微妙之处,因此我们也没有意识到

新的NHibernate.Transform.distinctroventityResultTransformer()

这可能会消除我们的重复项,但我很难看到当它不是映射实体(即DTO)时,我们如何做到这一点

我们已经尝试创造一种习惯方言,它似乎已经很好地为一些人服务,足以让他们对一致的行为充满信心

我意识到世上没有银弹,环境永远是关键,但有人能想出解决办法吗

我们用于处理页面排序的代码如下所示:

        query.SetMaxResults(50);

        for (int i = 0; ; ++i)
        {
            query.SetFirstResult(i * 50);
            IList results = query.List();
            cumulativeResults.AddRange(results);
            OnRecordsLoaded(results.Count);
            if (results.Count < 50)
            { break; }
query.SetMaxResults(50);
对于(int i=0;;++i)
{
query.SetFirstResult(i*50);
IList results=query.List();
累积结果添加范围(结果);
OnRecordsLoaded(results.Count);
如果(结果计数<50)
{break;}
非常感谢您在这方面的任何意见。 致以亲切的问候
Colin

NHibernate不会产生重复项。关系数据库会产生重复项。您无法阻止这种情况

如果您的查询涉及一对多联接,比如说您有客户和订单表,客户和订单之间存在一对多关系,并且您查询按订单过滤的客户,那么您将得到多个(具有相同身份的)客户

防止它的方法是在内存中使用HashedSet,假设您对您应该使用的实体使用propery overrode Equals和GetHashCode。如果您将结果放入HashedSet(来自Iesi或.NET 4),它们将删除重复项

这是ORMs的陷阱之一