我在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 :(得分:2)
您也可以使用LINQ to 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还会为结果集中的每个VehicleRegistrants
获取所有Vehicle
,并且以下ThenFetch(x => x.Owner)
告诉“并且对于每个VehicleRegistrants
,获取其Owner
“。
这有帮助吗?
答案 1 :(得分:0)
将变量更改为:
VehicleRegistration vehicleRegistrationsAlias = null;
VehicleRegistrant vehicleRegistrantsAlias = null;
将JoinAlias行更改为:
.JoinAlias(() => vehicleAlias.VehicleRegistrations, () => vehicleRegistrationsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.JoinAlias(() => vehicleAlias.VehicleRegistrants, () => vehicleRegistrantsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
查询将急切地获取。
在List之前调用:
.TransformUsing(Transformers.DistinctRootEntity)