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

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以实现自己的 IEqualityComparer 并将其添加到您的查询中,如下所示。
然后像这样使用它
考虑修复您的连接,这样您就不会在连接中添加
.Left
重复项。如文档中所述。
You can implement your own IEqualityComparer and add it to your query like this.
And then use it like this
Consider fixing your join so you don't get duplicates adding
.Left
to your join.As described in the documentation.