嗨大家我知道这个问题已经多次,但我根本找不到解决方案。 我真的很感激一些帮助。我是nHibernate的新手,有点厚,所以请放轻松。
我想做的就是以下内容: 生成列表及其类别(ManyToMany)的分页列表
如果您只想从一个表中读取,但下面的代码可以正常工作,但是由于涉及到连接表,您将获得大量重复项。
我可以使用.SetResultTransformer(Transformers.DistinctRootEntity)删除重复项 但是页面和行计数到处都是。
以下是商家信息的地图:
public class ListingsMap : ClassMap<Listings>
{
public ListingsMap()
{
Table("Listings");
Id(x => x.ListingId);
Map(x => x.Company).Nullable();
Map(x => x.City).Nullable();
HasManyToMany(x => x.Categories)
.Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
.Table("Cats_Listings") //THIS IS THE LINK TABLE
.ParentKeyColumn("ListingId")
.ChildKeyColumn("ID");
}
}
以下是类别地图:
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Table("Categorys");
Id(x => x.CategoryId,"ID");
Map(x => x.Name, "Category").Nullable();
}
}
以下是我在控制器中的内容
public PagedResult<Data.Model.Listings> Get(int pageNo, int pageSize)
{
int RecCount;
var result = _session.CreateCriteria<Data.Model.Listings>("listings")
// .SetProjection(Projections.Distinct(Projections.Property("Company")))
// .SetProjection(Projections.Distinct(Projections.Property("City")))
.SetFetchMode("Categories", FetchMode.Eager)
.Add(Restrictions.Eq("isComp", isComp))
.Add(Restrictions.Eq("CountryID", cid))
.PagedResults<Data.Model.Listings>(pageNo, pageSize, out RecCount);
return result;
}
这是PagedResult对象
public class PagedResult<T>
{
public int CurrentPage { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; }
public int TotalItems { get; set; }
public IEnumerable<T> PageOfResults { get; set; }
}
以下是使用的方法 基于本网站上的答案(谢谢)
public static PagedResult<T> PagedResults<T>(this ICriteria criteria, int pageNumber, int pageSize, out int totalRecordCount)
{
//_filter = filter;
//_expr = expr;
_pageNumber = pageNumber;
_pageSize = pageSize;
var result = new PagedResult<T>();
result.PageSize = _pageSize;
result.CurrentPage = _pageNumber;
result.PageOfResults = criteria
.CloneNewCriteria()
.SetPaging()
// .SetResultTransformer(new DistinctRootEntityResultTransformer())
// .SetResultTransformer(new DistinctEntityRootTransformer())
// .SetResultTransformer(Transformers.DistinctRootEntity)
// .SetProjection(Projections.Distinct(Projections.Property("ListingID")))
.Future<T>();
totalRecordCount = criteria.GetTotalCount().Value;
result.TotalItems = totalRecordCount;
var pageCount = (double)totalRecordCount / result.PageSize;
result.PageCount = (int)Math.Ceiling(pageCount);
return result;
}
private static ICriteria CloneNewCriteria(this ICriteria criteria)
{
return CriteriaTransformer.Clone(criteria);
}
private static ICriteria SetPaging(this ICriteria criteria)
{
return criteria.SetMaxResults(_pageSize).SetFirstResult((_pageNumber - 1) * _pageSize);
}
private static IFutureValue<int> GetTotalCount(this ICriteria criteria)
{
criteria.ClearOrders();
return criteria
.SetProjection(Projections.RowCount())
.FutureValue<int>();
}
根据本网站上的其他答案,我已经尝试过的东西
如果我使用.SetResultTransformer(Transformers.DistinctRootEntity) 我想到了很多不同的行。直到我查看页面和行计数他们完全错了我想要每页20行,但我的数量变化取决于每个列表有多少类别。所以类别包括在行数中!
我也尝试删除.SetFetchMode(“Categories”,FetchMode.Eager) 但这导致:“ - 无法懒惰地初始化角色集合:...” 当然,这种常见问题有一个简单的解决方案吗? 非常感谢您的帮助。经过2天的尝试,我的智慧结束了。