2011-12-27 8 views
2

によってNHibernateは3.2 QueryOver明確な私は、2つのクラスプロパティ

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

そして、あなたはあなたの参加に .Leftを追加し、重複を得ることはありません。この

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

のようにそれを使用しています。

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

マニュアルに記載されています。

+0

しかし、私は、 'どこ')(一覧 ''除き、明確な(()新しいMyEqualityComparer)を適用することはできません。これに 'Distinct'を適用すると、リストから削除されるので、私が必要とするものではありません。 –

+0

' .List () ' –

+0

の後に最後に適用します。しかし、適切な方法ではありません。たとえば、1ページには5つのレコードが含まれていなければなりませんが、リスト上の別名の後には2しかありません。リストにないように別名を適用する必要があります –