NHibernate分页结果&行数不正确

时间:2011-03-10 16:18:20

标签: .net asp.net nhibernate fluent-nhibernate icriteria

我有一个名为'BusinessPage'的模型,它可以与一个或多个'BusinessPageCategories'相关联。所以我有一个名为'BusinessPagesInCategories'的第三个表,它连接了这两个。

我正在尝试获取BusinessPages的分页记录集以及记录总数(我可能总共有100行,但一次只返回20行,但我传回一个包含该总数的int除了20行)。

我遇到的问题是,由于我实现了“多对多”关系,因此它将同一个BusinessPage行带回x次(其中x是与BusinessPage关联的类别数)。我只想要返回每个业务页面的单个实例。所以我在NHibernate Criteria中添加了以下内容,以便给出不同的BusinessPage结果。

.SetResultTransformer(CriteriaSpecification.DistinctRootEntity);

虽然这对我有用,但我现在正确地为每个BusinessPage获取一行(并且每个BusinessPage中的我的Categories属性包含它所分配的正确x类别),我的行数不< / em>反映'distinct'计数 - 相反,如果我只有1个与3个类别相关联的BusinessPage记录,则行数为3!?!

BusinessPage(模型)

public virtual int BusinessPageId { get; private set; }
public virtual IList<BusinessPageCategory> Categories { get; set; }
public virtual string BusinessName { get; set; }

BusinessPageCategory(型号)

public virtual int CategoryId { get; private set; }
public virtual string CategoryName { get; set; }

BusinessPagesInCategories(用于关联两个模型的SQL表)

BusinessPageId
CategoryId

以下是我用来获取“分页业务页面”的代码:

public virtual IList<BusinessPage> GetPagedBusinessPages(int pageNumber, int pageSize, out int totalRecordCount)
{
    ICriteria c = CreateCriteria_BusinessPage()

        // we only want distinct business pages returned
        .SetResultTransformer(CriteriaSpecification.DistinctRootEntity);

    return c.PagedResults<BusinessPage>(pageNumber, pageSize, out totalRecordCount);
}

protected virtual ICriteria CreateCriteria_BusinessPage()
{
    return Session
        .CreateCriteria<BusinessPage>()
        .AddOrder(Order.Asc("BusinessName"));
}

以下是我获取分页结果和所有重要行数的扩展方法。

public static IList<T> PagedResults<T>(this ICriteria criteria, int pageNumber, int pageSize, out int totalRecordCount)
{
    var results = criteria
        .CloneNewCriteria()
        .SetPaging(pageNumber, pageSize)
        .Future<T>();

        totalRecordCount = criteria.GetTotalCount().Value;

        return results.ToList<T>();
}

public static ICriteria CloneNewCriteria(this ICriteria criteria)
{
    return CriteriaTransformer.Clone(criteria);
}

public static ICriteria SetPaging(this ICriteria criteria, int pageNumber, int pageSize)
{
    return criteria
        .SetMaxResults(pageSize)
        .SetFirstResult((pageNumber - 1) * pageSize);
}

public static IFutureValue<int> GetTotalCount(this ICriteria criteria)
{
    criteria.ClearOrders();

    return criteria
        .SetProjection(Projections.RowCount())
        .FutureValue<int>();
}

我还是NHibernate的新手,所以可能有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

问题解决了。事实证明,无论我是否需要按类别进行过滤,我都在为类别设置别名,因此,连接是在我不需要它的场景中建立的,因此带回来重复的行(每个加入一个类别)!

在我确实需要传递categoryid并在该类别中过滤我的结果的情况下,通过连接没有重复的行,因为每个商业页面只能被分配一次。

我觉得很奇怪,即使在我返回初始记录之后我还不想引用类别对象,它正在将此连接添加到类别中,但它看起来像在所需范围之外创建别名,不必要地强制加入和加载这些类别。