私はnhibernateを初めて使ったので、これを理解できませんでした。 私は以下のクラスに類似したエンティティを持っています。nhibernateは結合の代わりに別々のクエリを強制する
public class MotherCollection
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ISet<Class1> Collection1 { get; set; }
public virtual ISet<Class2> Collection2 { get; set; }
public virtual ISet<Class3> Collection3 { get; set; }
public virtual ISet<Class4> Collection4 { get; set; }
}
他のエンティティとの1対多の関係が多数あります。 この関係は以下のマッピングで設定します。
HasMany(d => d.Collection1).KeyColumn("McId");
HasMany(d => d.Collection2).KeyColumn("McId");
HasMany(d => d.Collection3).KeyColumn("McId");
HasMany(d => d.Collection4).KeyColumn("McId");
子クラスはsimiliaryに設定されています。
References(c1=>c1.MotherCollection).Column("McId");
などとなる。
私はすべての関係を取得、DBからこのエンティティを照会するとき、私はこの1つに似た巨大なクエリを取得:
SELECT * FROM MotherCollection mc
JOIN c1 on mc.Id=c1.mcId
JOIN c2 on mc.Id=c2.mcId
JOIN c3 on mc.Id=c3.mcId
JOIN c4 on mc.Id=c4.mcId
このクエリは重複する行の多く発生し、実行に時間の多くを取ります。
私は何とか
SELECT * FROM MotherCollection Where Id = @Id
SELECT * FROM c1 Where mcId = @Id
と、以下のような個々のSELECTクエリにこのクエリを区切るためにNHibernateはしたいです。コレクションが遅延ロードされたときの状況と少し似ています。 私は目的のコレクションを怠惰に設定し、自分のデータレイヤーを終了する直前にFirst()プロパティにアクセスすることで、この動作を達成することができました。しかし、私はNhibernateでこれを行うもっとエレガントな方法がなければならないと思っています。
私はこれに類似したクエリを試してみた:
var data = session.QueryOver<DataSet>().Fetch(d=>d.Collection1).Eager.Fetch(d=>d.Collection2).Eager....
ありがとうございました。
データのクエリに使用しているコードを含めることはできますか? – AlexDev
私はいくつかの異なる方法を試しましたが、1つを含める – Rudithus