1

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

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

我遇到的问题是,由于我实现了多对多关系,它带回了相同的 BusinessPage 行 x 次(其中 x 是 BusinessPage 关联的类别数)。我只希望返回每个业务页面的单个实例。因此,我将以下内容添加到我的 NHibernate Criteria 以提供 Distinct BusinessPage 结果。

.SetResultTransformer(CriteriaSpecification.DistinctRootEntity);

虽然这对我有用,因为我现在正确地获得了每个 BusinessPage 的一行(并且每个 BusinessPage 中的 Categories 属性包含它分配给的正确 x 类别),但我的行数并没有反映“不同”的计数 -相反,如果我只有 1 个与 3 个类别相关联的 BusinessPage 记录,则行数为 3!?!

业务页面(模型)

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 还是很陌生,所以可能有一个简单的解决方案?

4

1 回答 1

0

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

在我确实需要传入 categoryid 并过滤该类别的结果的场景中,通过连接没有重复的行,因为每个业务页面都可以被分配一次任何 1 个类别。

我觉得奇怪的是,即使在返回初始记录之前我不想引用类别对象,但它正在加入类别,但看起来在所需范围之外创建该别名,强制加入以及不必要地加载这些类别。

于 2011-03-11T13:15:23.127 回答