简体   繁体   English

NHibernate 3.2 QueryOver按属性区分

[英]NHibernate 3.2 QueryOver distinct by property

I have two classes 我有两节课

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

And mappings 和映射

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

And i want to take paged news, sorted by its category's name. 我想获取分页新闻,按其类别名称排序。 Here is the query: 这是查询:

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

But in result i take many duplicated news in my list. 但是结果我把很多重复的新闻带入了我的清单。 I think it's probably because of joins both enabled in mappings and used in query. 我认为这可能是因为在映射中启用并在查询中使用了联接。 So, is there any solution how to do distinct by one property or another way to avoid this problem? 那么,有什么解决方案如何通过一种属性或另一种方法来区分来避免此问题?

You can implement your own IEqualityComparer and add it to your query like this. 您可以实现自己的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();
    }
}

And then use it like this 然后像这样使用

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

Consider fixing your join so you don't get duplicates adding .Left to your join. 考虑修复您的.Left ,这样就不会在向.Left中添加.Left重复。

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

As described in the documentation. 如文档中所述。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM