Записаться в список для списка

У меня есть таблица на С# и ASP.net, которая ссылается на список другой таблицы, в которой несколько владельцев регистрации транспортных средств сопоставляются с одним транспортным средством. Я не хочу проходить через всю коллекцию владельцев регистрации транспортных средств, обращаясь к их отдельным членам (например, vehicleRegistrantsAlias[0]), потому что я не знаю, сколько их будет.

Нужно ли делать это в двух запросах? Я действительно хотел бы сделать все это в одном. У меня есть родительский класс в качестве транспортного средства и детская коллекция владельцев регистрации транспортных средств. Владелец транспортного средства является базовым типом, и под владельцем транспортного средства является владелец и оператор. Я также хочу вывести информацию из других дочерних таблиц. Я присоединяюсь от транспортного средства к транспортному средству Registrants, который работает нормально; однако, я также хочу потянуть владельца и опекуна.

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)

Ответ 1

Вы также можете использовать LINQ to NHibernate, это упрощает понимание запросов, чем API QueryOver.

Основываясь на комментариях, я думаю, вам нужна функция со следующей подписью:

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".

Помогает ли это?

Ответ 2

Изменить переменные на:

    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)