2011-12-27 35 views
2

我有兩個類NHibernate的3.2 QueryOver不同的屬性

public class News 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Topic { get; set; } 
    public virtual Category Category { get; set; } 
} 

public class Category 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; set; } 
    public virtual ISet<News> News { get; set; } 
} 

和映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models"> 
    <class name="News" table="News"> 
     <id name="Id"> 
      <generator class="native" /> 
     </id> 
     <property name="Date" not-null="true" /> 
     <many-to-one name="Category" fetch="join" column="CategoryId" class="Category, NHibernateManyToOne" not-null="true"/> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models"> 
    <class name="Category" table="Categories"> 
     <id name="Id" column="Id"> 
      <generator class="native" /> 
     </id> 
     <set name="News" fetch="join" cascade="all-delete-orphan"> 
      <key column="CategoryId" /> 
      <one-to-many class="News, NHibernateOneToMany" /> 
     </set> 
    </class> 
</hibernate-mapping> 

,我想採取分頁消息,通過其類別的名稱排序。 下面是該查詢:

Session.QueryOver<News>().JoinQueryOver(x => x.Category).OrderBy(x => x.Name).Asc.Skip(pageNumber*pageSize).Take(pageSize).List<News>(); 

但結果我把我的列表中很多重複的消息。我認爲這可能是因爲在映射中啓用並在查詢中使用的連接。那麼,有沒有解決方案如何通過一個屬性或另一種方式來避免這個問題?

回答

4

您可以實現自己的IEqualityComparer並將其添加到您的查詢中,如下所示。

class MyEqualityComparer : IEqualityComparer<News> 
{ 
    public bool Equals(News x, News y) 
    { 
     return x.Id == y.Id; 
    } 

    public int GetHashCode(News obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 
} 

,然後用它像這樣

Session.QueryOver<News>().JoinQueryOver(x => x.Category).List<News>() 
      .Distinct(new MyEqualityComparer()) 
      .OrderBy(x => x.Category.Name).Skip(pageNumber * pageSize).Take(pageSize).ToList(); 

考慮固定您的加入讓你不會重複添加.Left你的加入。

Session.QueryOver<News>().Left.JoinQueryOver(x => x.Category) 

正如文檔中所述。

+0

但我不能申請'鮮明(新MyEqualityComparer())'無處除了'名單()'。如果我將'Distinct'應用於此,它將不會是我需要的,因爲它會從列表中刪除它,因爲我知道 – 2011-12-27 17:56:43

+0

因此,將它應用於'.List ()' – 2011-12-27 17:57:21

+0

之後,但不是以適當的方式。例如,一個頁面應該包含5條記錄,但是在清單上它只有2個。所以我需要以某種方式將不同的清單應用於清單 – 2011-12-27 18:03:59