NHibernate 3.2 QueryOver отличается по свойству - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть два класса

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>();

Но в результате я беру много дублированных новостей в своем списке.Я думаю, что это, вероятно, из-за объединений, включенных в сопоставлениях и используемых в запросе.Итак, есть ли какое-нибудь решение, как сделать отличным одно свойство или другой способ избежать этой проблемы?

1 Ответ

4 голосов
/ 27 декабря 2011

Вы можете реализовать свой собственный 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();

Рассмотрите возможность исправления своего объединения, чтобы вы не 't получить дубликаты, добавляющие .Left к вашему объединению.

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

Как описано в документации.

...