次の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)
Description
Fluent 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が次の値をクエリする前に子オブジェクト全体をフェッチすることを意味します。Header
Child.Description
Description
(ここでは複合キーが問題になるとは思いません。結合は正常に機能しているようです。これは、関心のないすべてのデータを取得せずにデータを取得する方法です)
現時点では、私のヘッダーエンティティは次のようになっています。
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"));
これは私が望むように機能します-誰かがより良い提案を持っているなら、私はそれを受け入れますが、私が言ったように、私はスキーマにまったく触れることができません