私は nHibernate (v 3.3.2) を流暢に使用するプロジェクトに取り組んでおり、既存のすべてのクエリは Linq のようなものを使用した IQueryOver です...
ストアド プロシージャを使用することで、その複雑な構文の学習を回避できると考えました。しかし、それらを呼び出すことは非常に難しいことが証明されています.
CreateSqlQueryを試しましたが、「クエリを実行できませんでした」という GenericADOException が発生しました。.hbm.xml ファイルを定義して、次の場所にロードしようとしました。
m.HbmMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
それから:
IQuery query = session.GetNamedQuery("sp_GetTagCount");
しかし、名前付きクエリが見つかりませんでした。おそらく XMLfile がロードされていないと思います。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="sp_GetTagCount" callable="true" >
<return class="TagCount" />
exec sp_GetTagCount
</sql-query>
</hibernate-mapping>
これがアプリに追加した唯一の XML または構成であるため、さらに構成が必要になる可能性があります。
sproc の代わりに流暢なクエリを使用できれば幸いですが、コピーする必要があるのは単一のテーブル選択だけです。
SQL は非常に単純です。
SELECT TOP 10
t.[Id], t.[Name], count(*) as [Count]
FROM [dbo].[Tag] t inner join
[dbo].[TagEntry] te on t.Id = te.TagId
GROUP BY t.[Id], t.[Name]
ORDER BY [Count] DESC
このクエリを nHibernate に取り込むには、何らかの方法が必要です。「nhibernate fluent tutorial」で多数の Google 検索を試しましたが、DB 構成とクラス構成だけが議論されているようです。このクエリ構文を学ぶ必要があります。私はこれに何時間も費やしましたが、進歩していないようです。
この流暢なクエリ構文で結合、グループ化、および集計を複製するための優れた初心者向けチュートリアルに誰かが私を導くことができれば、それは素晴らしいことです!
Oskar の提案に従って、Nhibernate.Linq を使用していくつかの進歩を遂げました。
私はこれを書いていました:
var results = (from t in session.Query<Tag>()
join e in session.Query<TagEntry>()
ただし、TagEntry はモデルに存在しません。
HasManyToMany(x => x.Entries)
.Table("TagEntry")
.ParentKeyColumn("TagId")
.ChildKeyColumn("EntryId")
.Inverse()
.LazyLoad();
各タグには Entries プロパティがありますが、これは便利ですが、グループ化するにはどうすればよいですか?