2009-03-25 12 views
0

私は4つの異なるエンティティに参加しながら特定のデータセットを取得しようとしています。私がやったことは、この作業を取得しようとするようにセットアップDTOです:CastleのActiveRecordで複数のエンティティを照会する厳密に型指定されたコレクションを返すにはどうすればよいですか?

string hql = string.Format("select new LatestThread(m.Comment, m.Posted, u.UserName, u.Reputation, t.Id, t.Topic, u.Id, u.Avatar) from Thread as t inner join Message as m on t.Id = m.ThreadId inner join User as u on u.Id = m.PostedById inner join Activity as a on a.Id = t.ActivityId where a.Lineage like '{0}%' order by t.LastPosted desc", activityLineage); 

リターンrepository.SimpleQuery(0、10、HQL:

public class LatestThread 
{ 
    private readonly string comment; 
    private readonly DateTime posted; 
    private readonly string userName; 
    private readonly int reputation; 
    private readonly int threadId; 
    private readonly string topic; 
    private readonly int userId; 
    private readonly string avatar; 

    public LatestThread(string comment, DateTime posted, string userName, int reputation, int threadId, string topic, int userId, string avatar) 
    { 
     this.comment = comment; 
     this.avatar = avatar; 
     this.userId = userId; 
     this.topic = topic; 
     this.threadId = threadId; 
     this.reputation = reputation; 
     this.userName = userName; 
     this.posted = posted; 
    } 

    public string Comment 
    { 
     get { return comment; } 
    } 

    public DateTime Posted 
    { 
     get { return posted; } 
    } 

    public string UserName 
    { 
     get { return userName; } 
    } 

    public int Reputation 
    { 
     get { return reputation; } 
    } 

    public int ThreadId 
    { 
     get { return threadId; } 
    } 

    public string Topic 
    { 
     get { return topic; } 
    } 

    public int UserId 
    { 
     get { return userId; } 
    } 

    public string Avatar 
    { 
     get { return avatar; } 
    } 
} 

は今、私はそうのようなSimpleQueryを使用すると考えていました);

マイリポジトリ方法は、次のようになります。今では私のLatestThreadクラスの最上部にある[ActiveRecordの]に置くために私を求めています

public virtual IList<T> SimpleQuery<T>(int firstResult, int maxResults, string hql, params object[] parameters) 
    { 
     var query = new SimpleQuery<T>(hql, parameters); 
     query.SetQueryRange(firstResult, maxResults); 
     return query.Execute(); 
    } 

。私がするとき、それはプライマリキーを必要とし、それはちょうど間違ったルートのようです。

私は、DTOでないクラスに与えられたImport属性を参照するビットも読みました。すべての例では、2つのエンティティだけが結合されていますが、4つのエンティティはありません。すべて4にImportを追加する必要がありますか?あるいは、それが読み取り専用DTOクラスであることをARに伝える何かがありますか?私はこれをすべて間違ってやっています。私がやろうとしていることをやるための本当に簡単な方法があります。

TIA!

+0

は私が何をしたいのかを考えではありませんそれは簡単です。あなたはちょっと吹くすべての列を選択する必要が熱心に負荷項目にしたい場合はポストP \t \tから ...のように見えるp.Comments \t \tをフェッチ参加ところp.Id = 1 p.Blog \tをフェッチ参加 – rball

+0

http://trappedinaworldofcode.wordpress.com/2008/03/19/strongly-typed-results-from-nhibernate-html-projection-query/ – rball

答えて

2

新しいThreadクラス

[Import(typeof(LatestThread), "LatestThread")] 
[ActiveRecord("Thread")] 
public class Thread : ActiveRecordBase<Thread> { /* blah blah */ } 

にインポート属性を追加して、クエリの魔法が起こる:)

string hql = string.Format("select new LatestThread(m.Comment, m.Posted, u.UserName, u.Reputation, t.Id, t.Topic, u.Id, u.Avatar) from Thread as t inner join Message as m on t.Id = m.ThreadId inner join User as u on u.Id = m.PostedById inner join Activity as a on a.Id = t.ActivityId where a.Lineage like '{0}%' order by t.LastPosted desc", activityLineage); 

SimpleQuery<LatestThread> query = new SimpleQuery<LatestThread>(typeof(Thread), hql); 
LatestThread[] results = query.Execute() 

出典:http://www.kenegozi.com/Blog/2006/10/08/projection-using-activerecords-importattribute-and-hqls-select-new-clause.aspx

+0

ありがとう私はこれを試してみましょう! – rball

+0

私は実際にこの記事を以前に見ましたが、どこにインポートを置くべきか分からなかった。エンティティの1つに配置するだけですその後、私の最新のスレッドに戻って、私はどんな属性も必要ないはずですか?あなたの例から私は近くにいたようですが、私のexeは最後に間違っていました – rball

+0

リストはありません()メソッド... – rball

1

マップされていないタイプ([ActiveRecord]の属性と同じ)を照会することはできません。 AFAIKを使用すると、NHibernateにHQLを介してそのような新しい任意のオブジェクトインスタンスを作成させることはできません(誰かが別のことを知っていれば修正されます)。

あなたの最善の策は、投影クエリを実行し、返されたタプルを自分のタイプのインスタンスにマップする方法です。

私の答えhereは、投影クエリを実行し、それを匿名型にマップする方法を示しています。あなたがしたいことはそれほど違いはありません。次に、型固有のリポジ​​トリまたはジェネリックリポジトリに対する強く型付けされた拡張メソッドでこれを行うメソッドを置くことができます。

+0

本当にnhibとcastleのarに新しい。私は "投影"を理解し始めているが、タプル? :P私はそれをチェックします。 – rball

関連する問題