2010-12-04 5 views
2
でこのクエリを行うことができます

私はNHibernateはどのように私はNHibernateは

select top 10 count(distinct classedition.createdby_id) as editions, class.id, 
     class.name, class.createdon, class.createdby_id 
from class 
inner join classedition on class.id = classedition.class_id 
group by class.id, class.name, class.createdon, class.createdby_id 
order by editions desc, class.createdon desc 

でこのクエリを行うことができますどのように私は成功せず、新規のLINQプロバイダでそれを実行しようとしましたNHibernateは3を使用しています。私は上記の正確なSQLクエリを生成する限り、それを行う方法は気にしません。可能であれば、魔法の文字列を使わずに強く型付けされたクエリを書く方が好きです。

私はNHibernateを初めて使うので、この質問は簡単かもしれません。ここで

は私がAutoMappingsと流暢NHibernateはを使用して、もう少し情報

です。 C#クラスは非常にシンプルです。

public class Class 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime CreatedOn { get; set; } 
} 

public class ClassEdition 
{ 
    public virtual int Id { get; set; } 
    public virtual Class Class { get; set; } 
    public virtual User CreatedBy { get; set; } 
} 

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

答えて

1

最後に、ビューを使用して問題を解決しました。

私は無礼になりたくはありませんが、NHibernateコミュニティは、質問そのものに答える方法を論じる傾向があるようです。 Diego Mijelshonの答えに対するコメントを参照してください。私はnhusers(Googleグループ)で同じ叱責を受けました。(Googleグループ):http://groups.google.com/group/nhusers/browse_thread/thread/4c74269aefb918fc

0

HQLクエリは強く型付けされ、オブジェクト指向です。

var results = session.CreateQuery(@" 
       select count(distinct e.CreatedBy), c.Id, 
        c.Name, c.CreatedOn, c.CreatedBy 
       from ClassEditions e 
       join e.Class c 
       group by c.Id, c.Name, c.CreatedOn, c.CreatedBy 
       order by 1 desc, c.CreatedOn desc 
       ") 
       .SetMaxResults(10) 
       .List(); 

あなたのC#コードも文字列です。 NHにはクエリコンパイラもあります。

実際には、クエリをマッピングファイルに入れると、HQL Language Service for Visual Studioをインストールすることで、インテリセンスとリアルタイムのエラーチェックを行うことさえできます。

そして、SessionFactoryを構築するだけの単なる単体テストでは、変更によって何かが壊れたかどうかがわかります。 Resharperのような現代のリファクタリングツールは、文字列、バインディング、またはあらゆる種類のファイルの名前を問題なく変更できます。

+1

これは普通の古い文字列なので「強く型付けされた」という意味ではありません。テーブル「クラス」の名前が変更されても、アプリケーションのコンパイルを妨げるものはありません。しかし、私は(それをまだ試していない)と思っています。私はこの答えを受け入れる前に、可能な選択肢を少し待つつもりです。 – W3Max

+0

クラスとマッピングを追加して助けてもらえますか? – Phill

+0

追加の説明を参照してください。 –