【问题标题】:Pagination issue with fluent nhibernate流利的nhibernate的分页问题
【发布时间】:2012-12-04 04:55:37
【问题描述】:

我在 MVC 4 应用程序中使用 NHibernate/Fluent NHibernate 最新版本。我通过 Nuget 安装了Fluent NHibernate,它的版本是1.3.0.733。 NHibernate 的版本类似于3.3.x

PM> 安装包 FluentNHibernate

请注意,我安装Fluent NHibernate 1.2.0.712 版本时不会出现此问题。

PM> 安装包 FluentNHibernate -Version 1.2.0.712

我有这样的查询,

public IList<Post> Posts(int pageNo, int pageSize)
{
  return _session.Query<Post>()
                 .Where(p => p.Published)
                 .OrderByDescending(p => p.PostedOn)
                 .Skip(pageNo * pageSize)
                 .Take(pageSize)
                 .Fetch(p => p.Category)
                 .FetchMany(p => p.Tags)
                 .ToList();
}

共有三个类:PostCategoryTag。在数据库中,我有 15 条记录为 Post。当我将 pageNo 作为 0 和 pageSize 作为 10 传递时,我从上述查询中只得到 7 条记录。为什么?

这里是类及其对应的映射类。

发帖

  public class Post
  {
    public virtual int Id
    { get; set; }

    public virtual bool Published
    { get; set; }

    public virtual DateTime PostedOn
    { get; set; }


    public virtual Category Category
    { get; set; }

    public virtual IList<Tag> Tags
    { get; set; }
  }

类别

  public class Category
  {
    public virtual int Id
    { get; set; }

    public virtual string Name
    { get; set; }

    public virtual string Description
    { get; set; }

    public virtual IList<Post> Posts
    { get; set; }
  }

标签

  public class Tag
  {
    public virtual int Id
    { get; set; }

    public virtual string Name
    { get; set; }

    public virtual string Description
    { get; set; }

    public virtual IList<Post> Posts
    { get; set; }
  }

邮政地图

  public class PostMap: ClassMap<Post>
  {
    public PostMap()
    {
      Id(x => x.Id);      
      Map(x => x.Published).Not.Nullable();
      Map(x => x.PostedOn).Not.Nullable();
      References(x => x.Category).Column("Category").Not.Nullable();
      HasManyToMany(x => x.Tags).Cascade.All().Table("PostTagMap");
    }
  }

类别图

  public class CategoryMap : ClassMap<Category>
  {
    public CategoryMap()
    {
      Id(x => x.Id);
      Map(x => x.Name).Length(50).Not.Nullable();
      Map(x => x.Description).Length(200);
      HasMany(x => x.Posts).Inverse().Cascade.All().KeyColumn("Category");
    }
  }

标签地图

  public class TagMap: ClassMap<Tag>
  {
    public TagMap()
    {
      Id(x => x.Id);
      Map(x => x.Name).Length(50).Not.Nullable();
      Map(x => x.Description).Length(200);
      HasManyToMany(x => x.Posts).Cascade.All().Inverse().Table("PostTagMap");
    }
  }

【问题讨论】:

  • 仔细检查一下:它们肯定都是“已发布”?
  • 您使用的是哪个版本的 NH?
  • 作为旁注,最好将 API 设计为采用 (firstresult, maxresults) 而不是 (pageno, pagesize),因为前者更灵活。
  • @hazzik 我更新了问题
  • @Simon 是的,所有帖子都已发布

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

请尝试检查这个答案:https://stackoverflow.com/a/13894326/1679310

问题很可能隐藏在Tag 集合的内联Fetch 中。这将导致一个 SELECT 子句返回更多行,然后 Post 计数。并且Take()Skip() 应用于此结果集...因此仅返回前 7 个帖子,因为其中一些具有更多标签:

帖子1 | TagA
Post2 | TagA
Post2 |标签B
..

【讨论】:

  • 解决方案是做一个“懒惰的获取” - 即。先用skip&take去掉帖子。然后通过使用 .Fetch / .FetchMany 丢弃结果查询 Post 来填充集合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多