2011-10-07 81 views
10

我在C#和ASP.net中有一張表,它引用了另一個表中的幾個車輛註冊者映射到單個車輛的列表。我不想通過訪問他們的個人會員(例如vehicleRegistrantsAlias[0])瀏覽整個車輛註冊人的集合,因爲我不知道會有多少人。加入聲明的清單

我需要在兩個查詢中做到這一點?我真的很想在一箇中做到這一切。我有父母班作爲車輛和兒童收集車輛註冊人。車輛註冊人是基本類型,根據車輛註冊人是車主和運營商。我也想從其他子表中獲取信息。我從車輛加入車輛註冊人,工作正常;不過,我也想拉主人和操作。

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將從兒童的集合中獲取所有兒童的信息。有點像加入語句中的foreach循環。我可以加入收集的孩子,而不只是單身孩子嗎? – joncodo

回答

2

您可以使用LINQ NHibernate的爲好,它通常使查詢更容易比QueryOver API理解。

基礎上的意見,我想你想用下面的簽名功能:

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(); 
} 

或者,如果你在方向VehicleRegistrant其父Vehicle的關係,這也將工作

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)告訴NHibernate也爲結果集中的每個Vehicle獲取所有VehicleRegistrants,以及以下ThenFetch(x => x.Owner)告訴「以及對於這些中的每一個VehicleRegistrants,也獲取其Owner」。

這有幫助嗎?

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)