2012-12-17 56 views
3

我在使用NHibernate /流利的NHibernate最新版本的MVC 4應用程序。我通過Nuget安裝了Fluent NHibernate,它的版本是1.3.0.733。 NHibernate的版本是一樣的東西3.3.x流利的nhibernate的分頁問題

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

P ostMap

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

只是雙重檢查:他們都肯定是「發佈」? –

+0

你使用的是什麼版本的NH? – hazzik

+0

作爲一個旁註,設計你的API可能會更好,因爲前者更靈活,可以採用(firstresult,maxresults)而不是(pageno,pagesize)。 –

回答

4

請嘗試檢查這個答案:https://stackoverflow.com/a/13894326/1679310

該問題很可能隱藏在Tag集合的內聯提取中。這將導致SELECT子句返回更多的行,然後計數爲Post。而Take()Skip()都在這個ResultSet應用......因此,只有前7個帖子返回,因爲他們中的一些具有更多標籤:

POST1 | TagA
Post2 | TagA
Post2 | TagB
..

+0

解決方法是做一個「懶取」 - 即。首先用skip&take取出帖子。然後使用.Fetch/.FetchMany查詢帖子來丟棄結果來填充集合。 – Goblin