3

MVC4アプリケーションでNHibernate/FluentNHibernateの最新バージョンを使用しています。Fluent NHibernateNugetを介してインストールしましたが、バージョンはです1.3.0.733。NHibernateのバージョンは次のようなものです3.3.x

PM>インストール-パッケージFluentNHibernate

Fluent NHibernateバージョン1.2.0.712をインストールしても、問題は発生しないことに注意してください。

PM>インストール-パッケージFluentNHibernate-バージョン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();
}

Post、、、の3つのクラスがありCategoryますTag。データベースには、の15のレコードがありPostます。pageNo0および10として渡すとpageSize、上記のクエリから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; }
  }

PostMap

  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");
    }
  }

CategoryMap

  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");
    }
  }

TagMap

  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");
    }
  }
4

1 に答える 1

4

この回答を確認してください: https://stackoverflow.com/a/13894326/1679310

この問題は、コレクションのインラインFetchに隠されている可能性が最も高いです。これは、カウントTagよりも多くの行を返す SELECT 句になります。Postとがこの結果セットTake()Skip()適用されます...最初の 7 つの投稿のみが返されます。これは、いくつかの投稿にはさらに多くのタグが含まれているためです。

投稿1 | タグA Post2
| タグA Post2
| タグ B
..

于 2012-12-17T07:13:16.370 に答える