0

私は 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 プロパティがありますが、これは便利ですが、グループ化するにはどうすればよいですか?

4

1 に答える 1

1

Linq を使用できますが、結合は必要ありません。nHibernate はそのマッピングで自動的にそれを行うと思うので、Entries プロパティを数えるだけです。

var results = (from t in Session.Query<Tag>()
    select new { Id = t.Id, TagUseCount = t.Entries.Count(), TagName = t.Name });
于 2013-09-18T11:03:38.153 に答える