从我发布这个问题开始,我已经设法找到其他人可能会觉得有用的解决方法/解决方案。
基本上,在这种情况下,您必须首先创建另一个查询,该查询明确选择主查询的主键以及分页。由于 DISTINCT(ID) 将只返回您想要的结果,因此您可以使用 SQL 的分页没有任何问题。然后,您重新运行主查询,不进行分页,但使用 ID 位于返回列表之一中的条件。我创建了一个通用方法,它采用标准,查找返回的 ID 并将它们作为条件添加到主要标准。下面的代码:
public static void LimitCriteriaByPrimaryKeys(this NHibernate.ICriteria criteria, string primaryKeyName, int pageNum, int pageSize)
{
var session = NHManager.Instance.GetCurrentSessionFromContext();
if (pageSize <= 0) pageSize = Int32.MaxValue - 1;
var nhSession = NHManager.Instance.GetCurrentSessionFromContext();
var pagingCriteria = (ICriteria)criteria.Clone();
IList ids = null;
var pKeyIDName = Projections.Property(primaryKeyName);
var pKeyProjection = Projections.Distinct(pKeyIDName);
{
{
//paging
pagingCriteria.SetProjection(pKeyProjection); //sets the primary key distinct projection
if (pageSize > 0)
{
if (pageNum < 1)
pageNum = 1;
int skipAmt = (pageNum - 1) * pageSize;
pagingCriteria.SetFirstResult(skipAmt);
pagingCriteria.SetMaxResults(pageSize);
ids = pagingCriteria.List(); //this returns the distinct list of IDs which should be returned for the given page & size
}
}
}
{
if (ids != null && ids.Count > 0)
{
criteria.Add(Expression.In(pKeyIDName, ids)); //adds the primary key restriction
var crit = criteria;
crit.SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer());
}
else
{
criteria.Add(Expression.Eq(pKeyIDName, 0)); //this is added specifically so that the main criteria returns NO results
criteria.Add(Expression.Eq(pKeyIDName, 1));
}
}
}
这些方法NHManager.Instance.GetCurrentSessionFromContext();
可以替换为您自己的方法,以从会话工厂检索当前会话。
希望能帮助到你!