Записаться в список для списка
У меня есть таблица на С# и 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)