1

次のNHibernateシナリオを取ります。

私は2つのテーブルを持っています:

Header
  HeaderID    (int),
  ForeignKey1 (int),
  ForeignKey2 (int)

Child
  ForeignKey1 (int),
  ForeignKey2 (int)
  Description (varchar)
  ...
  Metric Shed Ton Of Other Columns That Im Not InterestedIn(various types)

DescriptionFluent NHibernateを使用しています-オブジェクトの値を親に投影したいですChild(これは正しい用語ですか?!)-しかし、明らかChildにその列に多くのデータが含まれています-私はそれをすべて望んでいません追加のデータ、説明だけ... NHに次のクエリに相当するものを生成させるにはどうすればよいですか?

select 
    Header.*, Child.Description 
from 
    Header 
inner join 
    Child ON Header.ForeignKey1 = Child.ForeignKey1 AND Header.ForeignKey2 = Child.ForeignKey2

これまでこれを機能させる唯一の方法は、Referenceマッピングを使用してエンティティから子を参照し、を指す Header非マッピングプロパティを作成することです。明らかに、これは、NHが次の値をクエリする前に子オブジェクト全体をフェッチすることを意味します。HeaderChild.DescriptionDescription

(ここでは複合キーが問題になるとは思いません。結合は正常に機能しているようです。これは、関心のないすべてのデータを取得せずにデータを取得する方法です)

現時点では、私のヘッダーエンティティは次のようになっています。

public virtual int HeaderID { get; set; }
public virtual int KeyColumn1 { get; set; }
public virtual int KeyColumn2 { get; set; }
public virtual Child Child { get; set; }
public virtual string Description { get { return Child.Description; } }

そのためのマッピング:

  Id(x => x.HeaderID);
  Map(x => x.KeyColumn1);
  Map(x => x.KeyColumn2);
  References<Child>(x => x.Child).Fetch.Join().Columns("KeyColumn1", "KeyColumn2").ReadOnly();

基本的に、スキーマを変更することはできません。テーブル内の残りのデータには関心Childがなく、ビューを作成することもできません(スキーマを変更することはできません)。

これが可能であれば、誰かアイデアがありますか?オブジェクトの大きなリストをクエリするつもりです。Headerそのフィールドが必要Childですが、クエリが永遠に続くことは望ましくありません。

これは、hqlまたはcrit APIを使用する代わりに、クエリレベルで実行する必要があることですか?

編集:

クエリAPIを使用してこれを機能させようとしています

Header.Session.QueryOver<Header>(() => parent)
            .Where(h => h.HeaderID == 1)
            .Inner.JoinQueryOver(x => x.Child, () => child)
            .Select(x => x.HeaderID, x => x.ForeignKey1, x => x.ForeignKey2, x => child.Description);

SQLをチェックすると、クエリがまさに私が望むものであることが示されますが、例外が発生しますSystem.Object[] is not of type Header and cannot be used in this generic collection

これは、私が取得しているのは-からの値の配列にすぎないためだと思います-これをオブジェクトSelect()に変換する方法はありますか?Header

編集:私は

Header.Session.QueryOver<Header>(() => parent)
            .Where(h => h.HeaderID == 1)
            .Inner.JoinQueryOver(x => x.Child, () => child)
            .Select(x => x.HeaderID, x => x.ForeignKey1, x => x.ForeignKey2, x => child.Description)
            .TransformUsing(new GenericResultTransformer(typeof(Header), "HeaderID", "ForeignKey1", "ForeignKey2", "Description"));

これは私が望むように機能します-誰かがより良い提案を持っているなら、私はそれを受け入れますが、私が言ったように、私はスキーマにまったく触れることができません

4

1 に答える 1

1

怠惰なプロパティの概念がありますが、それは実際には逆の状況です。つまり、除外したいプロパティが少数あります。

これがプレゼンテーションシナリオの場合は、NHibernateの任意のクエリメソッドを使用して、好きな列だけを投影できます。クエリ結果は完全なエンティティである必要はありません。たとえば、HQLとLINQのselect句、およびCriteria / QueryOverのSetProjection()ファミリを参照してください。

于 2013-01-24T20:17:09.770 に答える