2011-12-27 57 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