5

NHibernate 3.1.0.4000 での SQL クエリの結果に問題があります (MS SQL Server 2005 データベースを使用しています)。エンティティにマップされている と のAdverts2つのテーブルがあります:と。列 (および外部キー)を介して接続されます。InvestmentsAdvertInvestmentAdvertsInvestmentsInvestmentId

クエリの結果を保存するために、次の内部クラスを作成しました。

    class InvestmentWithAdvertsCount
    {
        public Investment inv { get; set; }

        public int cnt { get; set; }
    }

クエリは次のとおりです。

var investementsWithAdvertCounts = _session.CreateSQLQuery(
                            "select {inv.*}, (select count(1) from Adverts where InvestmentId = inv.Id) cnt from Investments inv")
                            .AddScalar("cnt", NHibernateUtil.Int32)
                            .AddEntity("inv", typeof(Investment))
                            .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvestmentWithAdvertsCount)))
                            .List<InvestmentWithAdvertsCount>();

このクエリを実行するとInvestmentWithAdvertsCount、正しく入力されたcntプロパティを持つインスタンスのコレクションを受け取りますが、invプロパティは に設定されていnullます。NHibernate のソースを調べてみたところ、invエイリアスが何らかの形でクエリから失われ、NHibernate はinvプロパティを入力しようとさえしていないようです。部分を削除すると、最初の要素がエンティティに設定され、2 番目の要素が対応する広告カウントに設定された.SetResultTransformer(タイプ の) 配列のリストを受け取ります。このクエリを変更して正しく入力する方法を教えてください。あるいは、このクエリを QueryOver、Criteria、または HQL に書き換える (生成された SQL コードの効率を維持する) 方法があるでしょうか?object[2]InvestmentInvestmentWithAdvertsCount

この問題について何か助けていただければ幸いです。ありがとう

4

1 に答える 1

14

非常に単純な LINQ to objects を使用して結果を処理する、クリーンな方法を次に示します。

session.CreateSQLQuery(
    "select {inv.*}, (select count(1) ... inv")
    .AddScalar("cnt", NHibernateUtil.Int32)
    .AddEntity("inv", typeof(Investment))
    .List<object[]>()
    .Select(x => new InvestmentWithAdvertsCount {inv = x[0], cnt = x[1]})
    .ToList();
于 2012-08-09T13:27:25.467 に答える