NHibernate 3.2 QueryOver 按属性区分

发布于 2024-12-23 10:05:07 字数 1763 浏览 4 评论 0原文

我有两个类

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

但结果我在列表中添加了许多重复的新闻。我认为这可能是因为在映射中启用了连接并在查询中使用了连接。那么,是否有任何解决方案如何通过一个属性或其他方式进行区分来避免此问题?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

慢慢从新开始 2024-12-30 10:05:08

您可以实现自己的 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)

如文档中所述。

You can implement your own IEqualityComparer and add it to your query like this.

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.

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

As described in the documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文