2011-10-07 12 views
10

複数の車両登録者が1台の車両にマップされている別のテーブルのリストを参照するC#とASP.netのテーブルがあります。どれくらいの人がいるかわからないので、個々のメンバーにアクセスして車の登録者のコレクション全体を調べたい(たとえばvehicleRegistrantsAlias[0])必要はありません。リストの結合ステートメント

これを2回のクエリで行う必要がありますか?私は本当にそれをすべて一つにしたいと思っています。私は車両としての親クラスと車両登録者の子コレクションを持っています。車両登録者は基本タイプであり、車両登録者の下にはオ​​ーナーとオペレータがいます。私はまた、他の子テーブルから情報を取得したい。私は車両から乗り物に参加しています。しかし、私はオーナーとオペラントを引っ張ってもらいたい。

Vehicle vehicleAlias = null; 
List<VehicleRegistration> vehicleRegistrationsAlias = null; 
List<VehicleRegistrant> vehicleRegistrantsAlias = null; 

.JoinAlias(() => vehicleAlias.VehicleRegistrations,() => vehicleRegistrationsAlias) 
.JoinAlias(() => vehicleAlias.VehicleRegistrants,() => vehicleRegistrantsAlias) 

//from vehicle registrants 
.JoinAlias(() => vehicleRegistrantsAlias[0].,() => vehicleSuspensionTypeAlias) 
+0

もうこれを明確にすることはできますか?私は詳しく説明します。 – joncodo

+0

あなたは何を探していますか、あるいはどのようにしたいSQLはどのように見えますか? – Firo

+0

sqlはすべての子の情報を子のコレクションから取得します。 joinステートメント内のforeachループのような並べ替え。子供一人だけでなく、子供のコレクションに参加できますか? – joncodo

答えて

2

あなたはそれが普通QueryOverのAPIよりも理解したクエリが容易になり、同様にNHibernateのにLINQを使用することができます。あなたが親VehicleからVehicleRegistrantからの方向に関係を持っている場合、これはまた

を働くだろう、

public Vehicle GetVehicle(VehicleRegistrant registrant) 
{ 
    var vehicle = session.Query<Vehicle>() 
         .FetchMany(x => x.VehicleRegistrants) 
         .ThenFetch(x => x.Owner) 
         .Where(x => x.VehicleRegistrants.Contains(registrant)) 
         .SingleOrDefault(); 
} 

または:コメントに基づいて

は、私はあなたが次のシグネチャを持つ関数をしたいと思います
public Vehicle GetVehicle(VehicleRegistrant registrant) 
{ 
    var vehicle = session.Query<Vehicle>() 
         .FetchMany(x => x.VehicleRegistrants) 
         .ThenFetch(x => x.Owner) 
         .Where(x => x == registrant.Vehicle) 
         .SingleOrDefault(); 
} 

これがまさにあなたが望んでいたかどうかはわかりませんが、私はあなたがそのアイデアを得ると信じています。 FetchMany(x => x.VehicleRegistrants)は結果セット内のVehicleそれぞれについてVehicleRegistrantsをすべてフェッチし、次のようにThenFetch(x => x.Owner)は "およびVehicleRegistrantsのそれぞれについてもOwnerをフェッチします"というようにNHibernateに指示します。

これは役に立ちますか?

0

変更する変数:

VehicleRegistration vehicleRegistrationsAlias = null; 
    VehicleRegistrant vehicleRegistrantsAlias = null; 

変更JoinAlias線へ:

.JoinAlias(() => vehicleAlias.VehicleRegistrations,() => vehicleRegistrationsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
.JoinAlias(() => vehicleAlias.VehicleRegistrants,() => vehicleRegistrantsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin) 

そしてクエリが熱心にフェッチします。

また、リストの前に呼び出す:

.TransformUsing(Transformers.DistinctRootEntity) 
関連する問題