nHibernate分页ICriteria独特记录HasMany。这真的很难吗?

时间:2013-04-12 15:08:21

标签: nhibernate paging icriteria

嗨大家我知道这个问题已经多次,但我根本找不到解决方案。 我真的很感激一些帮助。我是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天的尝试,我的智慧结束了。

0 个答案:

没有答案