我有一个名为'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的新手,所以可能有一个简单的解决方案吗?
答案 0 :(得分:0)
问题解决了。事实证明,无论我是否需要按类别进行过滤,我都在为类别设置别名,因此,连接是在我不需要它的场景中建立的,因此带回来重复的行(每个加入一个类别)!
在我确实需要传递categoryid并在该类别中过滤我的结果的情况下,通过连接没有重复的行,因为每个商业页面只能被分配一次。
我觉得很奇怪,即使在我返回初始记录之后我还不想引用类别对象,它正在将此连接添加到类别中,但它看起来像在所需范围之外创建别名,不必要地强制加入和加载这些类别。