加入声明列表

时间:2011-10-07 13:07:29

标签: c# asp.net nhibernate

我在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)

2 个答案:

答案 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)