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